有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA OneToOne和OneToMany实体实例化/创建

我的应用程序在域级别的值对象之间使用了大量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)没有更新现有的行,而是尝试在数据库中插入一个新条目。以下是我正在使用的一些课程:

@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;

帖子被几个类引用,其中我有:

@Entity
public abstract class Partecipante extends Utente{


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

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


共 (1) 个答案

  1. # 1 楼答案

    这不是提供商的问题,而是使用问题。当您调用persist时,JPA不要求提供程序立即执行insert——它们通常被延迟到刷新或提交时间。因此,在大多数情况下,你不会有实体存在的感觉。无论哪种方式,事务状态都应该标记为回滚——您不应该依赖persist来确定是否应该调用merge。可以调用em.find,也可以只调用实体上的em.merge,让JPA提供者决定是否应该为您执行插入或更新