我正在使用JPA2,Unitils,jUnit +其他东西。 我的问题涉及两个实体:
@Entity
public class CaseStuff implements Serializable {
....
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long caseStuffId;
@OneToOne(mappedBy = "CaseStuff")
private XCase xcase;
...
}
@Entity
public class XCase implements Serializable {
....
@OneToOne
@JoinColumn(name = "CASESTUFFID")
private CaseStuff caseStuff;
....
}
两个表都获得了另一个表的ID,因此它也可以反过来映射。 在jUnit-Test中,Unitils插入一个没有XCase的CaseStuff记录。我确认,它确实是空的。 但是,我使用以下查询:
"select s from CaseStuff s where s.xcase is null"
并返回0个CaseStuff对象。对“is not null”执行相同操作会返回对象,但在调试时检查CaseStuff.xcase时,它显然为null。
任何想法,这里有什么不妥?
编辑: Hibernate生成的SQL转换为
select
*
from
CaseStuff casestuff0_
where
(
casestuff0_.xcaseid is null
)
*用*
替换所有字段名称EDIT2: 在我将其更改为OneToOne-Relation之前,它是一个不必要的ManyToOne。 以前jUnit测试有查询
"select s from CaseStuff s where not exists (select x from s.xcase x)"
由于某些原因,这仍然可以正常工作,就好像s.xcase仍然是Set。
感谢所有试图与我联系的人。
答案 0 :(得分:0)
在您定义实体时,Xcase将具有外键
因此,它的id旁边的Xcase表将caseStuff_id(或其他名称)作为Xcase id的外键。
就像在这张图片中一样(制作名字的抽象)
在你的情况下,Person是Xcase,CaseStuff是PersonDetails
所以你可能是CaseStuff表(如果它是由持久性提供者生成的,则没有case id)
请从结构角度检查数据库级别以查看表的定义方式。