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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.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
JPA2/EclipseLink OneToMany cascade持续发布;引用完整性约束冲突“;_Jpa_Eclipselink - Fatal编程技术网

JPA2/EclipseLink OneToMany cascade持续发布;引用完整性约束冲突“;

JPA2/EclipseLink OneToMany cascade持续发布;引用完整性约束冲突“;,jpa,eclipselink,Jpa,Eclipselink,我有两个实体A和B: A.java: ... public class A implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "IDA", nullable = false) private Integer

我有两个实体A和B:

A.java:

...
public class A implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "IDA", nullable = false)
private Integer ida;
@Basic(optional = false)
@Column(name = "NAME", nullable = false, length = 30)
private String name;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "a")
private List<B> bList=new ArrayList();

public void addB(B bp){
bp.setA(this);
bList.add(bp);
}
...
bPK
字段是一个复合主键:

@Embeddable
public class BPK implements Serializable {
@Basic(optional = false)
@Column(name = "IDB", nullable = false, length = 20)
private String idb;
@Basic(optional = false)
@Column(name = "A_IDA", nullable = false)
private int aIda;

public BPK() {
}

public BPK(String idb, int aIda) {
    this.idb = idb;
    this.aIda = aIda;
}
...
SQL代码:

CREATE TABLE A (
idA INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(30) NOT NULL,
PRIMARY KEY(idA)
);

CREATE TABLE B (
idB VARCHAR(20) NOT NULL,
A_idA INTEGER UNSIGNED NOT NULL,
name VARCHAR(30) NOT NULL,
PRIMARY KEY(idB, A_idA),
FOREIGN KEY(A_idA)
REFERENCES A(idA)
  ON DELETE NO ACTION
  ON UPDATE NO ACTION
);
主要代码:

   A a=new A(null,"A1");
   BPK bpk=new BPK();
   bpk.setIdb("b1");
   a.addB(new B(bpk,"B1"));

   EntityManager em=getEntityManager();
   em.getTransaction().begin();
   em.persist(a);
   em.getTransaction().commit();
我得到这个错误:

 Exception in thread "main" javax.persistence.RollbackException: Exception  [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504):    org.eclipse.persistence.exceptions.DatabaseException
 [EL Warning]: 2012-03-26 01:29:16.724--UnitOfWork(1902320872)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504):  org.eclipse.persistence.exceptions.DatabaseException
 Internal Exception: org.h2.jdbc.JdbcSQLException: Referential integrity constraint  violation: "CONSTRAINT_42_1: PUBLIC.B FOREIGN KEY(A_IDA) REFERENCES PUBLIC.A(IDA)"; SQL  statement:
 Internal Exception: org.h2.jdbc.JdbcSQLException: Referential integrity constraint   violation: "CONSTRAINT_42_1: PUBLIC.B FOREIGN KEY(A_IDA) REFERENCES PUBLIC.A(IDA)";...
该错误表示违反了完整性约束,但为什么? 是否在a之前插入实体B的单一可能性。。。 需要帮忙吗? 先谢谢你

编辑: 只需替换此项:

 @JoinColumn(name = "A_IDA", referencedColumnName = "IDA", nullable = false, insertable = false, updatable = false)
通过这个:

 @MapsId("aIda")
最后,B.java:

 @NamedQuery(name = "B.findByName", query = "SELECT b FROM B b WHERE b.name = :name")})
 public class B implements Serializable {
 private static final long serialVersionUID = 1L;
 @EmbeddedId
 protected BPK bPK;
 @Basic(optional = false)
 @Column(name = "NAME", nullable = false, length = 30)
 private String name;
 @MapsId("aIda")
 @ManyToOne(optional = false)
 private A a;

在Embeddeble中,A_AID字段由aIda属性控制-这意味着必须使用A中的值设置该属性,然后才能持久化B

如果您使用的是JPA2.0,那么可以使用@MapsId(“aIda”)标记@manytone,这将允许您删除它的@JoinColumn。这将使JPA提供程序在b.bPK.aIda中使用持久化上的值设置值


如果您没有使用JPA 2,0,您可以通过先持久化A,然后将addB方法更改为同时设置B的bPK.aIda来设置它,或者可以更改字段,使JoinColumn可写,并使bPK.aIda可插入=false,Updateable=false。

您的A_-AID字段由可嵌入属性中的aIda属性控制-这意味着必须使用A中的值设置该属性,然后才能持久化B

如果您使用的是JPA2.0,那么可以使用@MapsId(“aIda”)标记@manytone,这将允许您删除它的@JoinColumn。这将使JPA提供程序在b.bPK.aIda中使用持久化上的值设置值


如果您不使用JPA 2,0,您可以先将A持久化,然后将addB方法更改为也设置B的bPK.aIda,或者更改字段,使JoinColumn可写,并使bPK.aIda可插入=false,可更新=false。

谢谢您的回答帮助我,只是一个小精度:netbeans生成了这些实体,不是我创建的,我只创建SQL表。。。。;我们必须熟悉注释,还是只使用生成所有注释的IDE?你有什么建议吗?我们一定要熟悉注释。自动生成在大多数情况下都能正常工作,但可能会出错,或者自动注释无法获得多个选项。因此,最好先使用自动注释进行逆向工程,然后再查看注释并修复您不需要的精选内容。感谢Chris,您的回答帮助了我,只是有点精确:netbeans生成了这些实体不是我创建的,我只创建SQL表。。。。;我们必须熟悉注释,还是只使用生成所有注释的IDE?你有什么建议吗?我们一定要熟悉注释。自动生成在大多数情况下都能正常工作,但可能会出错,或者自动注释无法获得多个选项。因此,最好先使用自动注释进行逆向工程,然后查看注释并修复不需要的剔除内容。
 @NamedQuery(name = "B.findByName", query = "SELECT b FROM B b WHERE b.name = :name")})
 public class B implements Serializable {
 private static final long serialVersionUID = 1L;
 @EmbeddedId
 protected BPK bPK;
 @Basic(optional = false)
 @Column(name = "NAME", nullable = false, length = 30)
 private String name;
 @MapsId("aIda")
 @ManyToOne(optional = false)
 private A a;