Hibernate 为什么@OneToOne双向关系在查询所属实体时给我一个空代理?
我正在使用Hibernate 5.2.4。 这两个实体具有一对一的双向关系:Hibernate 为什么@OneToOne双向关系在查询所属实体时给我一个空代理?,hibernate,jpa,one-to-one,bidirectional,Hibernate,Jpa,One To One,Bidirectional,我正在使用Hibernate 5.2.4。 这两个实体具有一对一的双向关系: @Entity @Table(name="post") public class Post { @Id @Column(name="id", nullable=false) private int id; @Column(name="text", nullable=false) private String text; @OneToOne(mappedBy="post
@Entity
@Table(name="post")
public class Post {
@Id
@Column(name="id", nullable=false)
private int id;
@Column(name="text", nullable=false)
private String text;
@OneToOne(mappedBy="post", fetch=FetchType.LAZY, optional=true)
private PostDetails details;
...
}
@Entity
@Table(name="post_details")
public class PostDetails implements Serializable {
@Id
@OneToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name="post_id", nullable=false)
private Post post;
@Column(name="date", nullable=false)
private Date date;
...
}
这是一对一双向关系的最基本情况。我认为唯一与基本情况不同的是,PostDetails
使用Post
作为其ID,而不是拥有自己的ID
以下是表格:
这是我的数据:
最后,这是我的问题:
PostDetails pd = s.createQuery(
"select pd"
+ " from PostDetails pd"
+ " join [fetch] pd.post p"
+ " where p.text like '%banana%'"
, PostDetails.class)
.setMaxResults(1)
.getSingleResult();
System.out.println(pd.getDate());
System.out.println(pd.getPost().getText()); // Null pointer here even when "join fetch" is used
为什么pd.getPost()
会给我一个null
?无论我是否使用join fetch
我总是得到一个null
。通过使用joinfetch
为两个表的所有列生成SQL查询,但Post
代理仍然为空。使用EAGER
作为提取类型也无法解决这一问题
如果我通过从Post
中删除PostDetails
使这种关系成为单向的,那么一切都会正常工作。为什么呢
以下是此示例的完整代码:
从概念上讲,查询一篇文章会更有意义。但是,如果您想到这个SSCCE,您可以发布生成的SQL。我真正想查询的是PostDetails。我甚至不需要后期初始化。问题是,如果/当我确实需要Post时,我会得到一个空指针,而不是使用一个代理来触发查询并提供属性。我添加了示例的全部代码。这是一个概念,从概念上来说,查询一篇文章更有意义。但是,如果您想到这个SSCCE,您可以发布生成的SQL。我真正想查询的是PostDetails。我甚至不需要后期初始化。问题是,如果/当我确实需要Post时,我会得到一个空指针,而不是使用一个代理来触发查询并提供属性。我添加了示例的全部代码。这是你的电话号码