我坚持使用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;
}
在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