gpt4 book ai didi

jpa - 复杂的 JPA 持续订单问题

转载 作者:行者123 更新时间:2023-12-04 23:51:42 31 4
gpt4 key购买 nike

我正在从事一个具有一些不寻常实体关系的项目,我在使用 JPA 时遇到了问题。有两个相关对象;用户,让我们称另一个 X。用户与 X 具有一对多和两个一对一的关系。它基本上看起来像这样

[用户实体]

@OneToMany(mappedBy="user", cascade=CascadeType.ALL, orphanRemoval=true)  
private List<X> xList;

@OneToOne
@JoinColumn(name = "active_x1_id")
private X activeX1;

@OneToOne
@JoinColumn(name = "active_x2_id")
private X activeX2;

[X实体]

@ManyToOne()  
@JoinColumn(name="user_id")
private User user;

当保留一个新用户时,我还想在单个事务中保留两个 x 实体(一个用于 activeX1,一个用于 activeX2)。 Jpa 处理这个有点奇怪,日志看起来像这样:

INSERT INTO X VALUES (...) // x1  
INSERT INTO USERS VALUES (...)
INSERT INTO X() VALUES (...) // x2
UPDATE USERS SET ...
UPDATE X VALUES (...) // updates x1

这使得无法在数据库中使用 NOT NULL 约束。有没有更好的方法来处理这些多重关系?还是一种控制 JPA 持久化对象的顺序的方法?在此操作中,JPA 似乎确实明确地试图对我不利。任何帮助将不胜感激。

最佳答案

为什么不直接使用@NotNull 注释呢?我认为没有办法改变持久顺序。你必须手动完成。像这样,

User user = ...;

if ( user.getActiveX1().getId() == null ) {
entityManager.persist( user.getActiveX1() );
} else {
entityManager.merge( user.getActiveX1() );
}

if ( user.getActiveX2().getId() == null ) {
entityManager.persist( user.getActiveX2() );
} else {
entityManager.merge( user.getActiveX2() );
}

if ( user.getId() == null ) {
entityManager.persist( user );
} else {
entityManager.merge( user );
}

关于jpa - 复杂的 JPA 持续订单问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4471058/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com