我有兩個實體的作用和格蘭特與下面的映射:插入新的實體產生級聯堅持,而不是級聯合並
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
您的保存方法是使用合併還是持續? – Chris
我正在使用spring數據jpa,JpaRepository接口中只有一個保存方法,具體取決於主鍵是否爲null,它將決定使用合併還是持久化。 –