我可以指定EntityTransaction事务顺序吗?



我们使用EclipseLink JPA在H2数据库的单个事务中插入两个表时遇到问题。

数据库模式看起来像…表A{…IP_ADDRESS Varchar2(15)不为空}

表B{…IP_ADDRESS Varchar2(15)不为空,约束MY_FK外键(IP_ADDRESS)引用A
}

我们遇到的问题是B上的外键约束导致事务失败。

我们正在做这个:

entityManager.getTransaction () .begin ();

entityManager。合并(保存到事务);entityManager。merge (Save to B transaction);

entityManager.getTransaction () .commit ();

看起来JPA正在尝试先保存到B并失败。或者它先检查B的约束条件?

无论如何,我们最理想的做法是像我多年前在oracle上使用PL/SQL那样:

BEGIN
Do the insert on A;
Do the insert on B;
commit;
End;

我不认为Oracle查看约束直到事务完成。或者允许它完成,因为事务的未提交版本没有违反约束。

任何想法吗?我看了文档,还没有发现任何有用的东西。

感谢

我相信我已经找到了问题,尽管我希望从某种程度上比我更了解JPA的人那里得到确认。这里的问题是,在表示这两个表的实体类中没有定义外键约束。

结果,EntityManager对两个表之间的关系一无所知,并选择了一个任意的插入顺序。事务失败,因为JPA试图在表a的行之前插入表B行。

我通过在表B中添加一个@ManyToOne关系和一个@OneToMany关系表a来解决这个问题。我将获取类型设置为lazy作为关系定义,因为不需要使用任何获取结果。

在Table A实体类中:
// bi-directional one-to-many association to PositionHostPermission
@OneToMany( mappedBy = "the a entity", fetch=FetchType.LAZY )
private Set<B> bInstances;

在Table B实体类中:

//bi-directional many-to-one association to ipAddress
@ManyToOne( fetch= FetchType.LAZY )
@JoinColumn(name="IP_ADDRESS",insertable=false, updatable=false )
private A aTableInstance;

最新更新