我有两个类,Test2和Test3.Test2有一个属性test3,它是Test3的一个实例.换句话说,我有一个单向的OneToOne关联,test2引用了test3.
当我从db中选择Test2时,我可以看到正在进行单独的选择以获取相关test3类的详细信息.这是着名的1 + N选择问题.
要修复此问题以使用单个选择,我尝试使用fetch = join注释,我理解为@Fetch(FetchMode.JOIN)
但是,如果将fetch设置为join,我仍会看到单独的选择.以下是我的设置的相关部分..
hibernate.cfg.xml中:
<property name="max_fetch_depth">2</property>
Run Code Online (Sandbox Code Playgroud)
测试2:
public class Test2 {
@OneToOne (cascade=CascadeType.ALL , fetch=FetchType.EAGER)
@JoinColumn (name="test3_id")
@Fetch(FetchMode.JOIN)
public Test3 getTest3() {
return test3;
}
Run Code Online (Sandbox Code Playgroud)
NB我将FetchType设置为EAGER绝望,即使它无论如何都默认为EAGER OneToOne映射,但它没有任何区别.
谢谢你的帮助!
编辑:我几乎放弃了尝试使用FetchMode.JOIN - 任何人都可以确认他们已经让它工作,即产生左外连接?在文档中,我看到"通常,映射文档不用于自定义提取.相反,我们保留默认行为,并使用HQL中的左连接提取覆盖特定事务"
如果我做一个左连接取代:
query = session.createQuery("来自Test2 t2 left join fetch t2.test3");
然后我确实得到了我想要的结果 - 即查询中的左外连接.
Edit number 2:
Guys, thank you so much for your responses. Now I want to get to the bottom of this. I usually find that when I investigate something, I end up …
我使用JPA在Spring中有一个非常复杂的模型结构.当使用Spring Data查询我的数据库时,我期待一个查询使用JOINS来检索数据,而Spring正在运行多个查询.以下是我的模型结构:
Feed属性:
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;
}
Run Code Online (Sandbox Code Playgroud)
饲料:
public class Feed {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="feedId", nullable=false, length=100)
private Integer feedId;
@Column(name="feedName", nullable=false, 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 …Run Code Online (Sandbox Code Playgroud)