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

Hibernate:将外键设置为引用现有父PK的新子表行

仉明知
2023-03-14

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

CREATE TABLE Parent(
    ParentPK bigint NOT NULL,
    TypeCode int NULL,
    Id bigint NULL,
    FullName varchar(50) NULL
}

CREATE TABLE Child(
    ChildPK bigint NOT NULL,
    Code int NULL,
    Designation int NULL,
    ParentFK bigint NULL
}

ALTER TABLE Child ADD
  CONSTRAINT FK_Child_Parent FOREIGN KEY(ParentFK)
    REFERENCES Parent (ParentPK)

实体类:

@Entity
@Table(name="Parent")
public class ParentType extends HibernateEntity{


    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="KeyGenerator")
    @GenericGenerator(name = "KeyGenerator",
        strategy = "services.db.hibernate.KeyGenerator")
    protected Long parentPK;

    protected String id;
    protected int typeCode;
    protected String fullName;

    @OneToMany(mappedBy="parent",targetEntity=ChildType.class,fetch=FetchType.LAZY,cascade = CascadeType.ALL)
    protected List<ChildType> child;
}

@Entity
@Table(name="Child")
public class ChildType extends HibernateEntity{

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="KeyGenerator")
    @GenericGenerator(name = "KeyGenerator",
        strategy = "services.db.hibernate.KeyGenerator")
    protected Long childPK;
    protected int code;
    protected int designation;

    @ManyToOne(cascade={CascadeType.ALL})
    @JoinColumn(name="ParentFK")
    protected ParentType parent;
}

共有1个答案

颜举
2023-03-14

在Hibernate(和JPA)中,您主要使用的不是ID,而是对象的实例。因此,您需要加载ParentType的实例,然后将其设置为ChildType的实例,而不是设置父对象的ID。

在JPA(我更习惯于JPA)中,它将类似于:

java prettyprint-override">long parentId = ...; // you get this from the sender system
ParentType parent =
    entityManager.find(ParentType.class, parentId);
// Now you can set the parent to instances of ChildType,
// and Hibernate will store the correct ID into the database.

在冬眠状态下,它会像

...
ParentType parent =
    (ParentType)session.get(ParentType.class, parentId);
...
 类似资料:
  • 考虑类家长: 和类儿童: 如果我在应用程序中创建一个新的子对象,并将其放入父对象的children字段中,然后持久化父对象,为什么Hibernate不自动更新子对象的Parent字段(以便设置parentID列)?

  • 我有这个型号 而我有这个方法 但是hibernate没有设置实际地址id和注册地址id(它是OneTONE) Hibernate:插入客户(名字、姓氏、中间名、性别)值(?、、?、?)2021-03-18 14:01:58.340警告12836---[nio-8080-exec-1]o.h.发动机。jdbc。spi。SqlExceptionHelper:SQL错误:0,SQLState:23502

  • 我有一个父表和子表。父记录已由其他进程插入。我需要添加引用父记录的子记录,例如: 插入CHILD记录时,引用父记录的唯一信息是地址。我需要从父表中获取PARENT_ID,使用子的ADDRESS来设置子的FK。 在hibernate中有没有一种方法可以做到这一点,这样我就不需要通过地址查询父项来将其与子记录一起插入?或者,我是否继续沿着这条路径,按地址查询父对象,然后将父对象传递给子对象?

  • 问题内容: 我正在尝试使我的@OneToMany和@ManyToOne关系正确。 第1类: 第2类: 当我加载或保存新记录时,这种关系似乎运行良好: 但是,当我尝试更新该记录时,它将尝试将IdeaProfileId设置为null: 当我调试时,我可以看到IdeaProfileId确实在音高对象上设置了… 仅供参考,我不是直接更新从数据库加载的原始对象。这些域映射到UI更新的Model类。因此,在保

  • 我的数据库技能有点生疏,所以对我来说学习Hibernate有点难。 我一直在阅读一对一、一对多和多对多,简而言之,这是我年轻时的理解: 一对一:-表A链接到表B中的另一行,表A中的行数必须等于表B中的行数。 一对多:-每家公司可以有很多员工。 多对多:-许多医生可以拥有/分享不同的病人。(无意双关语)。 假设我有以下表格,对于殡仪员客户模型 [id[pk]、全名(char)、年龄(int)、地址(

  • 问题内容: 我正在研究一个基本示例来测试操作,但出现异常。 我有以下实体: Employee.java EmpDetails.java 现在我在数据库中有员工ID为10的记录,在员工详细信息表中有相应的记录。 现在,当我在查询下面运行时: 我在想hibernate将删除员工记录和相应的员工详细信息记录,因为我已设置要删除的层叠类型。但我得到异常为: 引起原因:com.mysql.jdbc.exce