我已經在互聯網上看到過有關如何在保存/更新/刪除期間修復TransientObjectExceptions的帖子,但是在調用Criteria時,我遇到了這個問題。org.hibernate.TransientObjectException在Criteria.list()
我有兩個對象A和B. A有一個名爲b的字段,它是B類型的。在我的映射b中映射爲多對一。這一切都運行在一個更大的持久化框架中(該框架有點像核心數據),所以我沒有在我的hibernate映射中使用任何級聯,因爲級聯在更高級別上處理。
這是圍繞我的標準的有趣的代碼:
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();
基本上我尋找類型的所有對象,且ab等於B的特定實例(其實我試圖重組的查詢,使我傳遞b的id只是爲了確保b不會導致我的問題)。
這裏是發生堆棧跟蹤當我打電話criteria.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?最好我想找到一個不依賴級聯的解決方案,因爲它們傾向於掩蓋更高級別框架中出現的問題。
你可以顯示對象'b'來自你的代碼嗎?它是否持久? – 2010-04-08 20:54:05
彼得,你是個天才!我保存b的會話早已不在這一點,所以我必須在新的會話中更新b,然後再根據條件調用list。請添加一個答案,以便我可以授予您信用額度。 – rancidfishbreath 2010-04-08 21:33:55
感謝:-)我在此期間添加了我的答案。 – 2010-04-08 21:37:58