Java Spring JPA FetchMode. Join does not use join

I use JPA to have a very complex model structure in spring When using spring data to query my database, I expect a query to use joins to retrieve data, and spring is running multiple queries Here is my model structure:

Feed properties:

public class FeedAttribute {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="FeedAttributeId",nullable=false)
private Integer FeedAttributeId;

@ManyToOne(cascade = CascadeType.DETACH)
@Fetch(value=FetchMode.JOIN)
@JoinColumn(name="FeedId",nullable=false)
private Feed Feed;

@ManyToOne(cascade = CascadeType.DETACH)
@Fetch(value=FetchMode.JOIN)
@JoinColumn(name="sourceEntityAttributeId",nullable=false)
private EntityAttribute sourceEntityAttribute;

@ManyToOne(cascade = CascadeType.DETACH)
@Fetch(value=FetchMode.JOIN)
@JoinColumn(name="targetEntityAttributeId",nullable=false)
private EntityAttribute targetEntityAttribute;

}

Feed:

public class Feed {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="FeedId",nullable=false,length=100)
private Integer FeedId;

@Column(name="FeedName",length=100)
private String FeedName;

@ManyToOne(cascade = CascadeType.DETACH)
@Fetch(value=FetchMode.JOIN)
@JoinColumn(name="releaseId",nullable=false) 
private Release release;

@ManyToOne(cascade = CascadeType.DETACH)
@Fetch(value=FetchMode.JOIN)
@JoinColumn(name="sourceSystemId",nullable=false) 
private System sourceSystem;

@ManyToOne(cascade = CascadeType.DETACH)
@Fetch(value=FetchMode.JOIN)
@JoinColumn(name="targetSystemId",nullable=false) 
private System targetSystem;

@ManyToOne(cascade = CascadeType.DETACH)
@Fetch(value=FetchMode.JOIN)
@JoinColumn(name="companyId",nullable=false)  
private Company company;

}

Entity properties:

public class EntityAttribute {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="entityAttributeId",nullable=false)
private Integer entityAttributeId;

@Column(name="entityCode",length=100)
private String entityCode;

@Column(name="attributeCode",length=100)
private String attributeCode;

@ManyToOne(cascade = CascadeType.DETACH)
@Fetch(value=FetchMode.JOIN)
@JoinColumn(name="dataModelId",nullable=false)  
private DataModel dataModel;

}

Data model:

public class DataModel {

@Id
@Column(name="dataModelId",nullable=false)
private String dataModelId;

@Column(name="dataModelDescription",nullable=false)
private String dataModelDescription;

@ManyToOne(cascade = CascadeType.DETACH)
@Fetch(value=FetchMode.JOIN)
@JoinColumn(name="companyId",nullable=false)  
private Company company;

}

System:

public class System {

@Id
@Column(name="systemId",length=100)
private String systemId;

@Column(name="systemName",nullable=false)
private String systemName;

@ManyToOne(cascade = CascadeType.DETACH)
@Fetch(value=FetchMode.JOIN)
@JoinColumn(name="systemSubType",nullable=true)
private SystemSubType systemSubType;

@ManyToOne(cascade = CascadeType.DETACH)
@Fetch(value=FetchMode.JOIN)
@JoinColumn(name="systemType",nullable=false)
private SystemType systemType;

@ManyToOne(cascade = CascadeType.DETACH)
@Fetch(value=FetchMode.JOIN)
@JoinColumn(name="companyId",nullable=false)  
private Company company;

}

release:

public class Release {

@Id
@Column(name="releaseId",length=100)
private String releaseId;

@Column(name="releaseDescription",length=1000)
private String releaseDescription;

@Column(name="releaseDate")
private Date releaseDate = new Date();

@Column(name="releaseLocation",nullable=false)
private String releaseLocation;

@ManyToOne(cascade = CascadeType.DETACH)
@Fetch(value=FetchMode.JOIN)
@JoinColumn(name="companyId",nullable=false)
private Company company;

}

You got the picture – I won't continue adding models I'm running this query using spring data:

FeedAttributeRepository.findByFeed(Feed);

This will query all feed properties for a given feed Now, what I expect to happen is to run a query against the feedattribute table, join the entityattribute twice and join the feed Then I will expect the subsequent nested values in the feed to be connected (system, publishing), and the values nested in entityattribute (datamodel) will be connected - and so on, for all fetchmodes I specify JOIN.

In fact, what actually happens is that spring is running multiple selection queries, some are joining, others are not In my example, the entityattribute object is not connected on the feedattribute object Retrieve each feedattribute returned by running multiple select statements Return about 300-400 feedattributes, which, as you can imagine, is very inefficient

Is there an upper limit on the number of joins that can be executed? Or does JPA think this is the best way to retrieve data? As I know, many joins can also be inefficient thank you

PS: it is working with MySQL, but I am turning to Oracle. The whole process runs out of cursors on the database because of the number of select statements executed A bit of a nightmare!

Solution

You seem to encounter a misunderstanding here: only through its primary key (that is, through entitymanager. Find (ID, type) or feedattributerepository Findone (ID)) only considers the lazy / eager definition of an object when loading an object Hibernate disables the global get query execution plan

For query methods, you must explicitly specify the extraction connection in the query definition (which will require a manually declared query), or use @ entitygraph to define the extraction graph for the query method (see reference documentation for details)

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>