2013-05-20 105 views
0

这孩子当em.persist被称为JPA孩子没有坚持

@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

Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: DB2 SQL Error: SQLCODE=-530, SQLSTATE=23503, SQLERRMC=ADMINISTRATOR.Z_CHILD.CC1369070983676, DRIVER=3.58.81 {prepstmnt 864433030 INSERT INTO Z_CHILD (id, NAME, PARENT_ID) VALUES (?, ?, ?) [params=(int) 450, (String) Child1, (int) 0]} [code=-530, state=23503] at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:281) at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:257) at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$1000(LoggingConnectionDecorator.java:72) at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:1199)

+1

你需要更多的英语解释你想要做的事情。代码格式良好,但问题看起来不愉快,因为它没有解释。 – sventechie

+0

当em.persist(父)调用 –

回答

2

SQLCODE:-530 FOREIGN KEY约束名的插入或更新值无效

你必须明白,所生成的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(); 
+0

感谢英语评论时,此子实体不随父母一起保存:) – Gab