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

在Hibernate中,如何自动检索父id并将其作为外键用于子插入?

宇文航
2023-03-14

我想要的操作:如果需要,在子表中插入一行会自动在父表中插入一行,否则将父表中现有行的id用作子表中插入行的外键。

我想知道是否有任何方法可以使用一个会话在hibernate中实现上面提到的功能。保存(子项)语句。

我使用Hibernate与Java和SQLite。以下是我关于数据库和配置的详细信息:

表家长:

{id (int): primary key, description (text): unique}

表儿童:

{id(int): primary key, address (text), parent_id (integer): foreign key refers Parent(id)}  [UNIQUE ( address, parent_id )]

POJO家长:

{int id, String description, Set<Child> children, [getters and setters] }

POJO儿童:

{int id, String address, Parent parent, [getters and setters]}

父母亲哈佛商学院:

...
<id column="id" name="id" type="long">
    <generator class="native"/>
</id>
<property column="description" name="description" type="string" unique="true" />
<set fetch="select" inverse="true" lazy="true" name="children" table="Child">
    <key>
        <column name="parent_id" not-null="true"/>
    </key>
    <one-to-many class="Child"/>
</set>
...

小孩哈佛商学院:

....
<id column="id" name="id" type="long">
    <generator class="native"/>
</id>
<property column="address" name="address" type="string"/>
<many-to-one cascade="save-update" class="Parent" fetch="select" name="parent">
    <column name="parent_id" not-null="true"/>
</many-to-one>
...

现在,如果父项(具有相同的“描述”)不存在,则父项将与子项一起插入。否则,不会插入子项,因为父项插入由于唯一的“说明”要求而失败。

由于插入子对象时我不知道父对象的id(我只知道父对象的描述),因此无法执行会话。加载(Parent.class,parentId)以检索父对象并使用它插入子对象。我现在做的是:

Parent parent = new Parent();
parent.setDescription("D1");

Child child = new Child();
child.setAddress("A1");

parent.getChildren().add(child);
child.setParent(parent);
session.save(child);

我知道我可以通过执行查询select id from parent where description=“D1”首先查找父id,然后如果结果集为空,则在我现在执行时保存子id(这也会插入父id),如果结果不为空,则使用会话。load()加载父对象并使用它插入子对象。但我认为hibernate可以在一次会话后为我处理这个问题。保存(子项)。可以吗?

共有1个答案

徐智渊
2023-03-14

试试这个步骤;

1.改变你的父母。hbm

 ...
<id column="id" name="id" type="long">
    <generator class="native"/>
</id>
<property column="description" name="description" type="string" unique="true" />
<set fetch="select" inverse="true" lazy="true" name="children" table="Child" cascade="save-update">
    <key>
        <column name="parent_id" not-null="true"/>
    </key>
    <one-to-many class="Child"/>
</set>
...

2.给孩子换衣服。hbm

....
<id column="id" name="id" type="long">
   <generator class="native"/>
</id>
<property column="address" name="address" type="string"/>
<many-to-one class="Parent" fetch="select" name="parent">
    <column name="parent_id" not-null="true"/>
</many-to-one>
...

3.根据需要在父项之前添加子项

Parent parent = new Parent();
parent.setDescription("D1");

Child child = new Child();
child.setAddress("A1");
child.setParent(parent);

session.save(child);
Set<Child> childsSet = new HashSet<Child>();
childsSet.add(child);

parent.setChildren(childsSet);
session.save(parent);
 类似资料:
  • 问题: 在Hibernate(JPA 2.0)中,在创建父对象时,如何创建具有@OneToOne关系的嵌入式对象? 期望值: 当我创建一个用户时,我希望它能自动创建相应的属性,将用户自动生成的作为属性的。 现实: 当我尝试创建用户时,我得到以下异常: 数据库表: 我有两个MySQL表:和 Java实体: 一个用户可以有多个属性,但每个属性都与该用户有@OneToOne关系,并且这种关系是单向的(即

  • 我想到了这个结构来将数据写入Firebase服务器。然而,我在实际代码中有复杂的情况,以这种方式编写结构。 null 这是我试图更新节点的函数。我在这里的思考过程是--我首先将计划标题和UID设置为要创建的自动ID。然后,我尝试引用auto ID创建的“键”,然后尝试存储all_images和all_dates,并使用对childByAutoID调用创建的相同键的引用来存储,然后更新这些值。 对不

  • 我试图用Hibernate保存一个表。父表与其子表具有一对多关系。父表POJO有其子表POJO的集合。 当我保存父表时,数据也被插入到它的子表中,但它的外键不为NULL。 下面是我的代码:家长: 儿童: Hibernate服务: 我找到了一个解决方案,将我的孩子反向映射到父母,如下所示 但我在想这是否可以避免。我希望还有其他方法,我不需要把我的每个孩子都映射到父母那里。 Kinldy帮助,如果你能

  • 问题内容: 我正在使用Laravel 4,我需要在MySQL表中插入一些行,并且需要找回插入的ID。 对于单行,我可以使用,但是它不支持多行。如果我至少能像普通的MySQL一样检索第一行的ID,就足以找出其他的ID。 问题答案: 根据用户Xrymz的建议,返回第一个。 根据Schemaapi 接受数组 所以你必须能够 就是说,如果使用MySQL,则可以由此检索第一个ID并计算其余的ID。还有一个功

  • 我坚持使用Hibernate的父子对象。在这里,父对象带有一个,这是发送者系统的主键,并且总是唯一的。 对于每一个带有父id的新传入对象不存在,那么父对象将用我的应用程序数据库特定的主键插入父表如果父id已经存在于我的应用程序数据库中,那么我只需要更新父表。但是,如果父母PK已经存在,我应该如何为子行插入父母FK?表结构: 实体类: