2016-09-29 74 views
0

我有兩個實體的作用和格蘭特與下面的映射:插入新的實體產生級聯堅持,而不是級聯合並

public class Role extends BaseBean { 
    private static final long   serialVersionUID = 1L; 
    private String      name; 
    private Set<Grant> grants = new HashSet<Grant>(); 
// get set 
} 

public class Grant implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private String   id; 
    private String   data; 
} 

映射ORM:

<entity name="q2role" class="tn.waycon.alquasar2.adm.model.Role"> 
     <attributes> 
      <basic name="name"> 
       <column length="800" nullable="false" unique="true"/> 
      </basic> 
      <many-to-many name="grants" fetch="EAGER"> 
       <join-table name="role_grant"> 
        <join-column name="role_id"/> 
        <inverse-join-column name="grant_id"/> 
       </join-table> 
       <cascade> 
        <cascade-all/> 
       </cascade> 
      </many-to-many> 
     </attributes> 
    </entity> 

<entity name="q2grant" class="tn.waycon.alquasar2.adm.model.Grant"> 
     <attributes> 
      <id name="id"> 
       <column name="id_g"/> 
       <generated-value stategy="IDENTITY" generator="SEQ_GEN"/> 
      </id> 
      <basic name="data"></basic> 
     </attributes> 
</entity> 

現在,當我嘗試插入包含現有授權的新角色時,事務將失敗,因爲eclipselink正在嘗試插入已存在的授予。爲什麼eclipselink正在做這種奇怪的行爲?我正在設置cascade-all,eclipselink必須足夠聰明才能在cascade-persist和cascade-merge之間分離。

Main { 
Role role = new Role(); 
List<Grant> grants = grantRepository.getGrantsBydata(List<String> datas); 
role.setGrants(grants); 
roleRepository.save(role); 
} 

日誌:

警告[HTTP-NIO-8080-EXEC-2] org.springframework.remoting.support.RemoteInvocationTraceInterceptor.invoke 處理HttpInvokerServiceExporter遠程呼叫導致致命 異常tn.waycon.alquasar2.adm.service.api.IAdminService.createRole org.springframework.transaction.TransactionSystemException:可能 未提交事務JPA;嵌套異常是 javax.persistence.RollbackException:異常[EclipseLink-4002] (Eclipse持久性服務 - 2.5.2.v20140319-9ad6abd) org.eclipse.persistence.exceptions.DatabaseException內部 異常:java.sql.BatchUpdateException:違反PRIMARY KEY 「PK__Q2GRANT__9DB7D2FA15DA3E5D」。不能插入 對象「dbo.Q2GRANT」重複鍵重複的鍵值(13969)錯誤代碼:。2627

+0

您的保存方法是使用合併還是持續? – Chris

+0

我正在使用spring數據jpa,JpaRepository接口中只有一個保存方法,具體取決於主鍵是否爲null,它將決定使用合併還是持久化。 –

回答

1

調用持續性會導致JPA插入根實體,但它也會級聯持續調用跨標記爲級聯人的關係ist類型。這間接意味着你正在調用持久化在你的分離的實體上,JPA規範要求提供者立即或當事務與數據庫同步(插入語句)時引發異常。

持續和級聯持久性選項僅用於在要插入新對象圖時使用,因此您可能需要重新評估放置在級聯持久性選項中的位置 - 它具有後果。

選項是

  1. 閱讀在現有實體將它們添加到新的實體 和使用管理的實例之前。因爲堅持託管實體 是無效的,這將解決您的問題。
  2. 改爲使用合併。合併 允許提供者查看實體實例,以確定它是否是新的或更新,並且如指定的那樣級聯到圖。 然後合併將把你的分離的實體並通過更新它適當地處理它 。
0

補助金是由角色分別管理,應該刪除 使用指當一個角色。插入,所有的授權也會被插入,當它被刪除時,授權也會被刪除 在你的情況下,我可以看到授權在創建角色時已經存在,所以你不希望它們被刪除當角色將被刪除時!