我在嘗試保持一對多關係時遇到異常。我可以看到問題發生,因爲在插入子項(鏈接)時父母的(政策)自動生成的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?
不需要映射更改,只需要設置調用link.setPolicy(policy)來填充鏈接表中的外鍵字段。 – Chris