2014-04-03 18 views
0

我在嘗試保持一對多關係時遇到異常。我可以看到問題發生,因爲在插入子項(鏈接)時父母的(政策)自動生成的ID未被使用。JPA鏈接級聯持續使用javadb具有空外鍵

SQL命令:

CREATE TABLE POLICIES 
(
    ID INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), 
    CURRENTLINKID INTEGER, 
); 

CREATE TABLE LINKS 
(
    ID INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), 
    ORDINAL INTEGER NOT NULL, 
    LINK VARCHAR(50) NOT NULL, 
    POLICYID INTEGER NOT NULL 
); 

ALTER TABLE POLICIES 
ADD FOREIGN KEY(CURRENTLINKID) 
REFERENCES LINKS(ID); 

ALTER TABLE LINKS 
ADD FOREIGN KEY(POLICYID) 
REFERENCES POLICIES(ID); 

實體:

@Entity 
@Table(name = "POLICIES", catalog = "", schema = "") 
public class PolicyEntity 
{ 
    ... 
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "_policy") 
    private Collection<LinkEntity> _linkEntityCollection; 
    ... 
} 

@Entity 
@Table(name = "LINKS", catalog = "", schema = "") 
public class LinkEntity 
{ 
    ... 
    @JoinColumn(name = "POLICYID", referencedColumnName = "ID") 
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = false) 
    private PolicyEntity _policy; 
    ... 
} 

創建實體和堅持:

LinkEntity link = new LinkEntity(); 
link.setLink("link"); 
link.setOrdinal(1); 

List<LinkEntity> links = new ArrayList<LinkEntity>(); 
links.add(link); 

PolicyEntity policy = new PolicyEntity(); 
policy.setLinks(links); 

EntityManager entityManager = _emf.createEntityManager(); 

// Begin transaction 
entityManager.getTransaction().begin(); 

// persist 
entityManager.persist(policy); 

// Commit the transaction 
entityManager.getTransaction().commit(); 

// Close this EntityManager 
entityManager.close(); 

例外:

javax.persistence.RollbackException:異常[TOPLINK-4002](甲骨文 TopLink的要點 - 2006.8(生成060830)): oracle.toplink.essentials.exceptions.DatabaseException內部 異常:java.sql.SQLIntegrityConstraintViolationException:柱 「策略ID '不能接受NULL值。錯誤代碼:20000調用:插入 查詢:InsertObjectQuery(?,?,?)bind => [ [email protected]


調用:插入鏈接(LINK,ORDINAL,POLICYID)VALUES(?,?,?) bind => [link,1,null] < ---如何在此設置自動生成的策略ID?

回答

0

根據Chris的評論更新。

我意識到我需要在鏈接實體中實際設置策略。現在鏈接插入毫無例外。

PolicyEntity policy = new PolicyEntity(); 
LinkEntity link = new LinkEntity(); 
link.setLink("link"); 
link.setOrdinal(1); 
link.setPolicy(policy) // set policy so it wasn't null 

List<LinkEntity> links = new ArrayList<LinkEntity>(); 
links.add(link); 

policy.setLinks(links); 
+0

不需要映射更改,只需要設置調用link.setPolicy(policy)來填充鏈接表中的外鍵字段。 – Chris