0

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

1 回答 1

0

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

在 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.

在休眠中它会像

...
ParentType parent =
    (ParentType)session.get(ParentType.class, parentId);
...
于 2012-08-08T18:23:18.563 回答