我有一个包含表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 ;
}