我使用Hibernate持久保存父子对象。这里Parent带有id
,它是发件人系统的主键,并且始终是唯一的
对于父ID不存在的每个新传入对象,父对象将插入父表中,并且我的应用程序数据库特定主键为ParentPK
,子行将插入相应的ParentFK
。
如果我的应用程序数据库中已存在父ID,那么我只需要更新父表。但是,如果ParentPK已经存在,我应该如何为子行插入ParentFK?
表结构:
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;
}
答案 0 :(得分:0)
在Hibernate(和JPA)中,您不主要使用ID,而是使用对象实例。因此,您需要加载ParentType
的实例,然后将其设置为ChildType
的实例,而不是设置父级的ID。
在JPA(我更习惯于JPA)中,它将类似于:
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.
在Hibernate中它会像
...
ParentType parent =
(ParentType)session.get(ParentType.class, parentId);
...