2つのエンティティ間に次の1対1(オプション)の関係があります。
@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)
いますが、それを無視する前に問題の原因を理解したいと思います。