我在两个实体之间具有以下一对一(可选)关系:
@Entity
@Table(name = "HLTH_RQRMT")
public class Requirement
{
...
@OneToOne(mappedBy = "healthRequirement", cascade = CascadeType.ALL)
private HealthRequirementSystemIdentifier requirementSystemId;
...
public HealthRequirementSystemIdentifier getRequirementSystemId()
{
return requirementSystemId;
}
}
@Entity
@Table(name = "HLTH_RQRMT_SYS_IDNTFR")
public class HealthRequirementSystemIdentifier
{
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "Hlth_Rqrmt_Id", nullable = false)
private Requirement healthRequirement;
}
从数据库加载需求后,会检查标识符:
//Load will always return a result (or exception) - works correctly.
Requirement requirement = (Requirement) getSession().load(Requirement.class, id);
//This is where the exception is thrown
if (requirement.getRequirementSystemId() == null)
当有标识符时,代码在所有环境中都可以正常工作。当没有标识符时,它在单元测试和本地(通过针对生产数据库的测试确认)中工作正常。当生产中没有标识符时,会抛出以下错误:
org.hibernate.ObjectNotFoundException: No row with the given identifier exists:
[Requirement#250583] at
org.hibernate.impl.SessionFactoryImpl$2.handleEntityNotFound(SessionFactoryImpl.java:419) at
org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:154) at
org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:143) at
org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:174) at
org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190) at
Requirement_$$_javassist_66.getRequirementSystemId(Requirement_$$_javassist_66.java) at
mypackage.myclass.processResponse(MyServiceImpl.java:244)
optional=false
我可以通过将属性添加到映射注释来触发单元测试中的上述错误。
什么可能导致单元测试和生产之间的结果不同?该optional
属性的默认值为 true,这就是它在单元测试中正常工作的原因。如果我添加属性optional=true
,它对单元测试没有影响,但它可能会解决生产中的问题吗?
我知道注释@NotFound(action=NotFoundAction.IGNORE)
,但我更愿意在忽略它之前了解问题的原因。