调用em.persist
时,此子实体不会与父实体一起保留
@Entity
@Table(name="Z_PARENT")
public class Parent {
@Id
@TableGenerator(name="parentIDGen", table="Z_JPA_ID_GEN",
pkColumnName="ID_STRING", valueColumnName="ID_GEN",
pkColumnValue="Z_PARENT")
@GeneratedValue(strategy=GenerationType.TABLE, generator="parentIDGen")
private int id;
@Column(name="NAME")
private String name;
@OneToMany(mappedBy="parent",cascade={CascadeType.ALL})
Set<Child> children;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
......
}
@Override
public boolean equals(Object obj) {
........
}
public Set<Child> getChildren() {
return children;
}
public void setChildren(Set<Child> children) {
this.children = children;
}
}
子表
@Entity
@Table(name="Z_CHILD")
public class Child {
@Id
@TableGenerator(name="childIDGen", table="Z_JPA_ID_GEN",
pkColumnName="ID_STRING", valueColumnName="ID_GEN",
pkColumnValue="Z_CHILD")
@GeneratedValue(strategy=GenerationType.TABLE,generator="childIDGen")
private int id;
@Column(name="NAME")
private String name;
@Column(name="PARENT_ID")
private int parentID;
@ManyToOne
@JoinColumn(name="PARENT_ID",referencedColumnName="ID")
private Parent parent;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getParentID() {
return parentID;
}
public void setParentID(int parentID) {
this.parentID = parentID;
}
@Override
public int hashCode() {
.....
}
@Override
public boolean equals(Object obj) {
.....
}
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
}
持久代码
em.getTransaction().begin();
Parent parent= new Parent();
parent.setName("Parent1");
Set<Child> children=new HashSet<Child>();
Child child1=new Child();
child1.setName("Child1");
children.add(child1);
parent.setChildren(children);
em.persist(parent);
em.getTransaction().commit();
openJPA生成的错误,我正在使用DB2
引起原因:org.apache.openjpa.lib.jdbc.ReportingSQLException:DB2 SQL
错误:SQLCODE = -530,SQLSTATE = 23503,
SQLERRMC = ADMINISTRATOR.Z_CHILD.CC1369070983676,驱动程序= 3.58.81
{prepstmnt 864433030插入Z_CHILD(ID,NAME,PARENT_ID)
值(?,?,?)[params =(int)450,(String)Child1,(int)0]} [code = -530,state = 23503]
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:281)
在
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:257)
在
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access $ 1000(LoggingConnectionDecorator.java:72)
在
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator $ LoggingConnection $ LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:1199)
最佳答案
SQL代码:-530
外键约束名称的插入或更新值无效
您必须了解,在持久化后阶段,在实体实例中设置了生成的ID。
JPA尚不能将生成的父ID传播给孩子。所以你必须自己设定
em.getTransaction().begin();
Parent parent= new Parent();
parent.setName("Parent1");
em.persist(parent); // here parent id is valuated
Set<Child> children=new HashSet<Child>();
Child child1=new Child();
child1.setName("Child1");
child1.setParentID(parent.getId());
children.add(child1);
parent.setChildren(children);
em.merge(parent);
em.getTransaction().commit();