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

JPA单向映射到插入子实体列表以及父实体单独插入子实体

伏星汉
2023-03-14

我的父母子女单向关系如下:

@Entity
@Table(name = "PARENT")
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private int parentId;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @JoinColumn(name = "parent_id", nullable = false)
    private List<Child> children;
}

@Entity
@Table(name = "CHILD")
public class Child {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private int id;

    @Column(name = "PARENT_ID", insertable = false, updatable= false)
    private int parentId;

    //some other field
}

我创建一个父实例,给它分配一个子列表,并尝试持久化它,它工作得很好。

Parent p = new Parent();
List<Child> children = new ArrayList<Child>();
Child c = new Child();
children.add(c);
p.addChildren(children);
em.persit(p);
em.flush();

当我试图通过子实体单独保存时,我看到insert查询试图将null插入子表中的列PARENT_ID,并导致

Child c = new Child();
c.setId(78987);
c.setParentId(12345);
em.persist(c);
em.flush();

异常,同时保存独立于父表的子实体。我试图插入的子实体与已经存在的父实体相关。

java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into (&quot;MY_SCHEMA&quot;.&quot;PARENT&quot;.&quot;PARENT_ID&quot;)_

在将关系定义为单向关系后,是否无法直接保存子实体?

共有1个答案

王彭薄
2023-03-14

当您做出@Shekhar Khairnar也提到的更改时,它将起作用。

当您将子级添加到父级时,它工作得很好,但在定义子级时不工作。

当创建/更新引用列的责任不在当前实体中,而是在另一个实体中时,您会这样做。

如果要使用单向并添加子对象,则应删除可插入=false定义。

然而,这种使用可能会导致数据不一致。你应该注意。

此外,在定义子节点时不需要给出id,因为这将根据您的模型自动创建,不会取您给出的值。

 类似资料:
  • 我想通过在父实体上调用保存来将父实体和子实体一起保存到MySQL数据库中。父实体和子实体之间有一对一的映射。父ID是自动生成的,我们需要在子实体中使用与子实体相同的pk。 我使用的是Spring数据JPA2.0(JPA提供程序是Hibernate)和Spring MVC框架。当尝试插入实体时,我遇到以下错误。 根本原因 这是我的数据库模式: 以下是我的Java实体父实体: 儿童性: 这是我的主要方

  • 主要内容:JPA实体插入示例在JPA中,我们可以通过实体轻松地将数据插入到数据库中。 提供方法来插入数据记录。 JPA实体插入示例 在这里,我们将演示如何使用实现插入学生的记录。 创建一个JPA项目,其项目目录结构如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为StudentEntity.java的实体类,这个类包含以下几个属性:, 和 。 文件:StudentEntity.java 的代码如下 - 第2

  • 我可能需要一些帮助,因为我被这些文件弄糊涂了: 我有一个JPA母公司: 和孩子: 如果我只是增加联系人,我希望JPA能够建立这种关系。 e、 g: 现在发生的是: 触点插入DB(良好) 使用providerX。联系人中的id。提供者列(良好) provider\u contact表中未显示任何关系条目 我知道我可以将联系人设置为提供者的属性<代码>providerX。联系人。添加(c)。。。回购。

  • 快速总结我想要实现的目标。请给出实施或设计建议:) 我有两个表:用户,图像。在UserDO中,我希望保留一组所有用户的图像,以及单个图像,即用户的肖像(在我的示例中,该组将包括肖像): 在ImageDO中,我有一个userid作为外键来记录哪个用户上传了图像。但是它没有布尔值,因为认为一个用户可能会上传许多图像,但只有一个是肖像。 有什么方法可以实现这一点吗?或者我需要维护另一个表(例如,Port

  • } 存储库类: 服务类别:

  • 在@JoinColumn中的一对多关系中,我从子表中设置name,从父表中设置reference column。但是,当我在上面的person类中用@OneToOne定义相同的单向关系时,我必须从person表而不是从name表中设置@JoinColumn名称。 我的问题是为什么这两个连接条件中的定义名称不同,在一个条件中,我必须将该名称设置为来自同一表的PK列名的名称,而在第二个示例中,我必须设