【问题标题】:JPA OneToOne and OneToMany entity instantiation/creationJPA OneToOne 和 OneToMany 实体实例化/创建
【发布时间】:2013-07-03 15:43:24
【问题描述】:

我的应用程序在域级值对象之间使用了很多 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 中选择哪种策略,我想在保存具有其他实体引用的对象时保存嵌套对象,它现在可以工作,但只是第一次,之后鉴于 SQL insert into Utente (passwd, DTYPE, username) values (?, 'Redattore', ?) [23505-168],我得到了 Unique index or primary key violation。显然我的 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 被几个类引用,其中 i 有:

@Entity
public abstract class Partecipante extends Utente{


@OneToMany(cascade = CascadeType.ALL,
           fetch = FetchType.LAZY)
private Set<Post> contributi;

然后我想知道初始化和持久化或更新数据库中那些引用对象的正确方法,提前致谢。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    这不是提供商问题,而是使用问题。当您调用persist 时,JPA 不要求提供者立即执行插入——它们通常会延迟刷新或提交时间。因此,在大多数情况下,您不会得到 EntityExistsException。无论哪种方式,都应将事务状态标记为回滚 - 您不应依赖持久性来确定是否应调用合并。要么调用 em.find,要么只对你的实体调用 em.merge,让 JPA 提供者确定它是否应该为你执行插入或更新。

    【讨论】:

    • 另请注意,由于在刷新/提交之前不需要发出语句,因此您也不会捕获 ConstraintViolationException。您可能必须在事务中显式调用 em.flush() 以确保发出语句并引发异常。
    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    相关资源
    最近更新 更多