Я видел сообщения по всему Интернету, в которых говорится о том, как исправить TransientObjectExceptions во время сохранения / обновления / удаления, но у меня возникает эта проблема при вызове списка в моих критериях.
У меня есть два объекта A иB. A имеет поле с именем b, которое имеет тип B. В моем отображении b отображается как многие-к-одному.Все это работает в более крупном постоянном фреймворке (фреймворк похож на Core Data), и поэтому я не использую никаких каскадов в моих отображениях гибернации, поскольку каскады обрабатываются на более высоком уровне.
Это интереснокод, соответствующий моим критериям:
A a = new A();
B b = new B();
a.setB(b);
session.save("B", b); // Actually handled by the higher level
session.save("A", a); // framework, this is just for clarity
// transaction committed and session closed
...
// new session opened
Criteria criteria = session.createCriteria(A.class);
criteria.add(Restrictions.eq("b", b));
List<?> objects = criteria.list();
В основном я ищу все объекты типа A, так что Ab равен конкретному экземпляру b (я фактически пытался реструктурировать запрос так, чтобы я передавал идентификатор bпросто чтобы убедиться, что b не вызывает у меня проблем).
Вот трассировка стека, которая происходит, когда я вызываю attribute.list ():
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: B
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:244)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:449)
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:141)
at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1769)
at org.hibernate.loader.Loader.bindParameterValues(Loader.java:1740)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1612)
at org.hibernate.loader.Loader.doQuery(Loader.java:717)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
at org.hibernate.loader.Loader.doList(Loader.java:2294)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2172)
at org.hibernate.loader.Loader.list(Loader.java:2167)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1706)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
Вот мое отображение:
<class entity-name="A" lazy="false">
<tuplizer entity-mode="dynamic-map" class="MyTuplizer" />
<id type="long" column="id">
<generator class="native" />
</id>
<many-to-one name="b" entity-name="B" column="b_id" lazy="false" />
</class>
<class entity-name="B" lazy="false">
<tuplizer entity-mode="dynamic-map" class="MyTuplizer" />
<id type="long" column="id">
<generator class="native" />
</id>
</class>
Может кто-нибудь помочь мневыяснить, почему я получаю TransientObjectException во время выборки?Предпочтительно я хотел бы найти решение, которое не опирается на каскады, поскольку они имеют тенденцию маскировать проблемы, возникающие в рамках более высокого уровня.