2016-03-08 63 views
0

首先,我使用EclipseLink 2.5.2,ojdbc6,spring-orm 4.1.1和QueryDSL 3.7.1。堅持始終生成插入查詢

我不明白爲什麼我的對象不在我的持久性上下文中(或者這是怎麼回事?)。 我使用QueryDSL查詢我的對象,但是當我嘗試使用entitymanager.persist()持久保存這樣的對象時,它總是會創建一個插入語句,導致重複的primarykey異常。 調用refresh()對象崩潰java.lang.IllegalArgumentException: Can not refresh not managed object。使用merge()工作正常,但這不是我想要的。我需要保留我原來對保存對象的引用。

的persistence.xml

<persistence version="2.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 

    <persistence-unit name="XXXXXX" 
     transaction-type="RESOURCE_LOCAL"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>jdbc/XXXXX</jta-data-source> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <properties> 
      <property name="eclipselink.weaving" value="static" /> 
      <property name="eclipselink.target-database" value="Oracle11" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

用於創建JPAQuery和刷新/合併/持續EntityManager的是相同的。

如果您需要更多信息/配置/等。請留下評論。我真的陷入困境,無法理清可能的原因以及其他信息可能對你們有用。

+0

你想堅持,包括ID的對象?即時猜測是pk –

+1

不要描述你的代碼。發表它。沒有理由對從查詢中獲得的對象調用persist()。 persist被用來插入新的實體。如果你從查詢中得到它們,那麼它們並不是新的。 –

+0

不能幫助刪除完整的類,但我會猜測問題是你試圖堅持一個已經存在於數據庫中的對象,這就是爲什麼你會得到主鍵異常,當然合併方法會起作用,因爲它像更新方法... –

回答

1

EntityManager.persist()用於製作瞬態實例持續。在這種情況下,transient(Hibernate使用的一個術語,對其他持久性提供者也是有效的)表示在持久性上下文或底層數據存儲中沒有表示的實體。它並不意味着用於數據庫中已存在的實體。使用merge()更新永久實體。

有一個article關於與代表這些國家之間的狀態的實體可以在與過渡一個不錯的狀態圖的主題: Entity states