我的应用程序在域级值对象之间使用了大量的OneToMany和OneToOne引用,其中大多数是实体,要么是超类,要么是某些子类。我想为我的应用程序提供一致(但很容易)保存这些实例的方法和实际方法save()就是这样
@Transactional
public void save(Post post){
try{
JPA.em().persist(post);
}catch (EntityExistsException eee){
JPA.em().merge(post);
}catch(ConstraintViolationException cve){
JPA.em().refresh(post);
}
}
当前的问题是如何正确实例化那些对象以及在cascadeType中选择哪个策略,我想在保存带有其他实体的引用的对象时保存嵌套对象,它现在可以工作,但仅限第一次,之后我得到Unique index or primary key violation
给出了SQL insert into Utente (passwd, DTYPE, username) values (?, 'Redattore', ?) [23505-168]
。显然我的JPA提供程序(hibernate 3.6.9)无法更新现有行,而是尝试在DB中插入新条目。这里有一些我正在使用的课程:
@Entity
@Table
public class Post extends Domanda {
@Column(nullable = false)
private String nome;
@OneToMany(cascade = CascadeType.ALL)
private List<Commento> commenti;
@OneToMany(cascade = CascadeType.ALL)
private List<Risorsa> risorse;
@OneToOne(cascade = CascadeType.ALL)
private NodoApprendimento nodo;
@Column
private int visibilità;
@Column
private boolean isDraft;
Post由几个类引用,其中有:
@Entity
public abstract class Partecipante extends Utente{
@OneToMany(cascade = CascadeType.ALL,
fetch = FetchType.LAZY)
private Set<Post> contributi;
然后我想知道在数据库中初始化和持久化这些引用对象的正确方法,提前感谢。
答案 0 :(得分:0)
这不是提供商问题,而是使用问题。当您调用persist时,JPA不要求提供程序立即执行插入 - 它们通常会延迟刷新或提交时间。因此,在大多数情况下,您不会获得EntityExistsException。无论哪种方式,都应该将事务状态标记为回滚 - 您不应该依赖persist来确定是否应该调用merge。可以调用em.find,也可以只在您的实体上调用em.merge,并允许JPA提供程序确定是否应该为您执行插入或更新。