Jpa迁移问题使级联在全球范围内持续存在



将jpa 1.x迁移到jpa 2.x

用户实体

Entity
public class User {
@OneToMany(fetch= fetch type.Eager, 
cascade = CascadeType.ALL)
Private List<Address> userAddresses = 
new ArrayList<>();
}
@Entity 
public class Addresses {
@ManyToOne(fetch=fetch type.EAGER) 
@JoinColumn(name = "address_type_id")
private AddressType addressType;
}

当我试图保存地址时,

低于错误

但是,此字段不允许级联持久化。无法刷新与非托管对象具有持久关联的非托管对象或图。建议的操作:a( 将该字段的级联属性设置为CascadeType.PERSIST或CascadeType.ALL(JPA注释(或";持久性";或";所有";(JPA-orm.xml(,b( 使级联全局持久化,c( 在刷新之前手动保持相关字段值。d( 如果引用属于另一个上下文,请通过设置StoreContext.setAllowReferenceToSiblingContext((来允许对其进行引用。

对于addresstype获取错误。

当我添加cascadetype.persist 时,这个错误就会消失

Entity 
public class Addresses { 
@ManyToOne(fetch=fetchtype.EAGER,
cascade= cascadetype.PERSIST)
@JoinColumn(name   ="address_type_id")
private AddressType addressType;
}

但我不想保存到addresstype。那么,还有其他解决方案可以解决这个问题吗?

来源https://openjpa.apache.org/builds/2.4.2/apache-openjpa/docs/jpa_2.2.html

级联持续行为在以前的版本中,OpenJPA会在持久化与该实体的关系之前,检查数据库中是否存在相关实体。这导致一个额外的Select被发送到数据库。在2.2.0中,添加了代码,这样当将持久性级联到没有持久性状态的相关实体时,持久性(插入(将在不首先检查数据库的情况下发生。如果相关实体已存在于数据库中,则这可能导致EntityExistsException。要将此行为恢复到以前的版本,请设置openjpa的值。兼容性属性CheckDatabaseForCascadePersistToDetachedEntity为true。

在将CheckDatabaseForCascadePersistToDetachedEntity设置为true后,错误消失了。

最新更新