Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有javadb的JPA toplink级联持久化具有空外键_Jpa_Javadb_Toplink - Fatal编程技术网

带有javadb的JPA toplink级联持久化具有空外键

带有javadb的JPA toplink级联持久化具有空外键,jpa,javadb,toplink,Jpa,Javadb,Toplink,我在尝试维持一对多关系时遇到了一个例外。我可以看到出现问题的原因是插入子项(链接)时没有使用父项(策略)自动生成的id 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 N

我在尝试维持一对多关系时遇到了一个例外。我可以看到出现问题的原因是插入子项(链接)时没有使用父项(策略)自动生成的id

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;
    ...
}
@实体
@表(name=“POLICIES”,catalog=“”,schema=“”)
公共类政策实体
{
...
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy=“\u policy”)
私人收藏(linkenticCollection);;
...
}
@实体
@表(name=“LINKS”,catalog=“”,schema=“”)
公共类链接
{
...
@JoinColumn(name=“POLICYID”,referencedColumnName=“ID”)
@manytone(fetch=FetchType.LAZY,cascade=CascadeType.ALL,可选=false)
私人政策实体政策;
...
}
创建实体并持久化:

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();
LinkEntity link=newlinkentity();
link.setLink(“link”);
链接。设置顺序(1);
列表链接=新建ArrayList();
链接。添加(链接);
PolicyEntity policy=新的PolicyEntity();
策略。设置链接(链接);
EntityManager EntityManager=_emf.createEntityManager();
//开始交易
entityManager.getTransaction().begin();
//坚持
entityManager.persist(策略);
//提交事务
entityManager.getTransaction().commit();
//关闭此EntityManager
entityManager.close();
例外情况:

javax.persistence.RollbackException:异常[TOPLINK-4002](Oracle) TopLink Essentials-2006.8(版本060830)): oracle.toplink.essentials.exceptions.DatabaseException内部 异常:java.sql.SQLIntegrityConstraintViolationException:列 “POLICYID”不能接受空值。错误代码:20000调用:INSERT 进入链接(链接、序号、策略ID)值(?、、?)绑定=>[LINK, 1,null] 查询:InsertObjectQuery(xxx.xxxx.xxx.xxx.datalayer.entities)。LinkEntity@1bb813b)


调用:在链接(链接、序号、策略ID)中插入值(?、、、?)
bind=>[link,1,null]根据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);
PolicyEntity policy=new PolicyEntity();
LinkEntity link=新的LinkEntity();
link.setLink(“link”);
链接。设置顺序(1);
link.setPolicy(policy)//设置策略使其不为null
列表链接=新建ArrayList();
链接。添加(链接);
策略。设置链接(链接);

不需要更改映射,只需要调用链接的设置。要填充链接表中的外键字段,需要setPolicy(policy)。