まず、このような冗長な質問についてお詫び申し上げます。:)
親から子へのマッピングがあり、 に参照がParent
あります。構造は次のとおりです。Child
OneToMany
Parent
Child
@Entity
@Table (name = "PARENT_TABLE")
class Parent {
@Id
@Column (name = "PARENT_ID")
protected Long parentId;
@Column (name = "PARENT_NM")
protected String parentName;
@OneToMany (mappedBy = "parent")
@Column (name = "PARENT_ID")
protected Set<Child> children;
}
@Entity
@Table (name = "CHILD_TABLE")
class Child {
@Id
@Column (name = "CHILD_ID")
protected Long childId;
@Column (name = "CHILD_NM")
protected String childName;
@ManyToOne
@JoinColumn (name = "PARENT_ID", referencedColumnName = "PARENT_ID")
protected Parent parent;
public String toString() {
return "Child [childId=" + childId + ", parentId=" + parent.getParentId() + "]");
}
}
私はこれに問題があります。Child
を使用してオブジェクトをロードしsession.load(Child.class, 10L)
、エンティティ オブジェクトを出力しようとすると、「Assertion Failure: null Identifier」というメッセージが表示されます。ただし、最初にParent
オブジェクトをロードしてからオブジェクトをロードすると、Child
正常に動作しています。
失敗するシナリオ
Child child = (Child) session.load(Child.class, 10L);
System.out.println(child);
うまくいくシナリオ
List<Parent> parents = (List<Parent>) session.createQuery("from Parent").list();
Child child = (Child) session.load(Child.class, 10L);
System.out.println(child);
例外スタック トレースは次のとおりです。
Exception in thread "main" org.hibernate.AssertionFailure: null identifier
at org.hibernate.engine.spi.EntityKey.<init>(EntityKey.java:69)
at org.hibernate.internal.AbstractSessionImpl.generateEntityKey(AbstractSessionImpl.java:241)
at org.hibernate.loader.Loader.extractKeysFromResultSet(Loader.java:722)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:635)
at org.hibernate.loader.Loader.doQuery(Loader.java:850)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.loadEntity(Loader.java:2042)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3710)
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:439)
at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:420)
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:204)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:143)
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:992)
at org.hibernate.internal.SessionImpl.immediateLoad(SessionImpl.java:907)
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:158)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:195)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
at Parent_$$_javassist_63.getParentId(Parent_$$_javassist_63.java)
at Child.toString(Child.java:110)
この問題を自分で分析しようとしたところ、障害のシナリオでは、child.parent
がアクセスされるたびに親オブジェクトがまだロードされていないことが原因であることがわかりました。
私の観察は正しいですか?
この問題を解決するにはどうすればよいですか?