JPA 2 - 在单个事务中持久保存具有FK约束的两个不同实体

时间:2016-05-15 17:25:31

标签: java database jpa-2.0

我有一个包含表Entity1和Entity2的数据库。 Entity2有一个coinstraint,它将它与Entity1相关联:一个简单的FK-PK关系。

我现在想在表Entity1中插入一行,并在表Entity 2中插入相应的行。这必须在单个事务中完成。我的尝试如下:

EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "BankingPU" );
EntityManager em = emfactory.createEntityManager();

em.getTransaction().begin();

//--- insert a bunch of checks which determine the value of a bool var "successful" here

Entity1 e1 = new Entity1;
Entity2 e2 = new Entity2;

//set attributes of the entities

em.persist(e1);
em.persist(e2);


if(successful) em.getTransaction().commit(); else
    em.getTransaction().rollback();

如果我继续这样做,则在提交时会抛出异常:

Query: InsertObjectQuery(banking.Entity2[ id=21 ]) Exception in thread "AWT-EventQueue-0" javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: org.postgresql.util.PSQLException: ERROR: insert or update on table "Entity2" violates foreign key constraint "Entity2_fk" Detail: Key (id)=(21) is not present in table "Entity1". Error Code: 0 Call: INSERT INTO Entity2 (id, attr2, attr3) VALUES (?, ?, ?) bind => [3 parameters bound]

此消息表示Key (id)=(21) is not present in table "Entity1",即使它应该来自第一个持久性。这是因为这是在交易中吗?我该如何解决这个问题?

此外,调用INSERT INTO Entity2 (id, attr2, attr3) VALUES (?, ?, ?)不正确,因为已设置值。

简而言之,在单个事务中使用FK约束保留两个不同实体的最佳方法是什么?

实体类的相关部分:

public class Entity1 implements Serializable {

@Column(name = "id")
private Integer id;
@Basic(optional = false)

@OneToOne(cascade = CascadeType.ALL, mappedBy = "Entity1 ")
private Entity2 entity2;

}


public class Entity2 implements Serializable {

@Column(name = "id")
private Integer id;
@Basic(optional = false)

@JoinColumn(name = "id", referencedColumnName = "id", insertable = false, updatable = false)
@OneToOne(optional = false)
private Entity2 entity2 ;

}

0 个答案:

没有答案