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

时间:2012-08-08 13:22:45

标签: java hibernate orm

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

1 个答案:

答案 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);
...