当前位置: 首页 > 知识库问答 >
问题:

JPA 一对一和一对一对多实体实例化/创建

宿淳
2023-03-14

我的应用程序在域级值对象之间使用了大量OneToMore和OneToOne引用,其中大多数是实体,要么是超类,要么是某物的子类。我想为我的应用程序提供一种一致(但简单)的方法来保存这些实例,实际的方法保存()就是这样

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

当前的问题是如何正确地实例化这些对象,以及在cassadeType中选择哪种策略,我想在保存带有其他实体引用的对象时保存嵌套对象,它现在可以工作,但只是第一次,之后我得到了一个唯一索引或主键冲突,因为SQL插入到Utene(passwd, DTYPE, username)值(?,'Redattore', ?) [23505-168]。很明显,我的JPA提供程序(Hibernate3.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;

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

共有1个答案

齐成和
2023-03-14

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

 类似资料:
  • 问题内容: 我在父方使用批注具有一对一关系。现在,我想自己保存子实体。 例如,我有和作为孩子的实体,我需要保存(父的id属性设置为之后的课程)。但是,当使用这种安排时,我在下面列出了一个例外… 为什么hibernate不允许这样做的任何想法?更清楚地说,我的代码如下… ParentEntity: ChildEntity: 我尝试保存的方式是… 关于如何尝试保存子实体,任何指针将不胜感激。 问题答案

  • 问题内容: 任何人都可以解释在设计带有示例的表时如何实现一对一,一对多和多对多关系吗? 问题答案: 一对一: 使用外键访问被引用的表: 您还必须在外键列()上设置唯一约束,以防止子表()中的多行与引用表()中的同一行相关。 一对多 :在关系的许多方面使用外键链接回“一个”侧: 多对多 :使用联结表(例如): 查询示例:

  • 问题内容: 好的,所以这可能是一个琐碎的问题,但是我在可视化和理解差异以及何时使用它们方面遇到困难。对于诸如单向和双向映射之类的概念如何影响一对多/多对多关系,我也还不清楚。我现在正在使用Hibernate,因此任何与ORM相关的解释都将有所帮助。 举例来说,我有以下设置: 那么在这种情况下,我将进行哪种映射?对于这个特定示例的答案肯定会受到赞赏,但我也确实希望获得何时使用一对多和多对多以及何时使

  • 这是项目迁移 这是时间表 这样用户就可以迁移了 这是我的项目模型 这是我的时间表模型: 这是我的用户模型 现在,我从项目返回我的查询 这是可以的,但user_id用户在timesheets.user_id我不能得到它的时间表,并得到它 此控制器按时间表中的项目id返回项目和时间表,但时间表中的用户id我不知道如何将其输入系统

  • 我在写一个简单的订单-付款一对一关联: 付款类别相关代码: 然后,我想实现一个基本方法,使用Spring Data JPA存储库为测试数据库种子化,但如果我尝试以下代码,我会得到一个表示: 如果我尝试这样做,也会出现同样的问题: 它的唯一工作方式如下: 我想明白为什么只有最后一种方法有效。在多对一关联中,我不必在保存之前设置双向关联,以便工作。我在这个案例中遗漏了什么关于超脱实体的行为?多谢了。

  • 主要内容:@ManyToOne 示例,程序输出结果多对一映射表示实体集合可以与相似实体关联的单值关联。 因此,在关系数据库中,实体的多于一行可以引用另一个实体的相似行。 完整的项目目录结构如下所示 - @ManyToOne 示例 在这个例子中,我们将创建一个学生和图书库之间的多对一关系,多个学生可以发布同一本书。 这个例子包含以下步骤 - 第1步: 在包中创建一个实体类,包含学生ID(s_id)和学生姓名(s_name),其中包含一个包含库类型对