如何在不通过hibernate中的共享主键在一对一关系中插入子节点的情况下保存父实体?

时间:2017-11-14 20:03:17

标签: java hibernate one-to-one

  

我在hibernate中通过共享主键使用一对一关系,   每当我调用save方法插入父实体而没有对子实体进行干扰时,我得到以下内容   例外

org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [com.example.sms.domain.Child.parent]

Schema of parent and child table

  

具有父类实体映射的子类实体的代码是   如下所示

@Entity
@Table(name = "t_child")
public class Child {

@Id
    @Column(name="user_id", unique=true, nullable=false)
    @GeneratedValue(generator="gen")
    @GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="user"))
    private Long id;

@OneToOne(optional = false,fetch = FetchType.LAZY)
    @PrimaryKeyJoinColumn
    private Parent parent;
  

在父类实体中,我已经映射了下面的子类实体

@OneToOne(mappedBy="parent", cascade=CascadeType.ALL)
    private Child child;

有没有办法只保存父实体而不插入子实体?

2 个答案:

答案 0 :(得分:0)

实体关系图没有向我们展示一对一的关系。但让我们假设它是。

如果我理解你,子实体依赖于父实体,它没有自己的身份。所以你不需要为它定义一个ID属性;所以Child实体的映射应如下所示:

@Entity
@Table(name = "t_child")
public class Child {

    @Id
    @OneToOne(optional = false,fetch = FetchType.LAZY)
    @JoinColumn(name="parent_id")
    private Parent parent;
    // ...

}

并且Parent实体应如下所示:

@Entity
@Table(name = "t_parent")
public class Parent {

    @Id
    @GeneratedValue(generator="gen")
    private Long id;

    @OneToOne(mappedBy="parent")
    private Child child;

    // ...
}

那应该是映射。现在,如果你想保存没有孩子的父母,请执行以下操作:

Parent parent = new Parent();
// set attribute values
entityManager.persist(parent);

但是如果你想保存孩子,你应该知道你首先必须保存父母,因为孩子依赖父母,这意味着父母必须存在。

答案 1 :(得分:0)

  

最后一天后我自己找到了解决方案

     

此代码是正确的。 Mapstruct正在创建一个问题   将Dto转换为域对象

@Mappings({

            @Mapping(source = "fatherName", target = "child.childDetail.fatherName"),
            @Mapping(source = "motherName", target = "child.childDetail.motherName"),
            @Mapping(source = "firstName", target = "child.childDetail.firstName"),
            @Mapping(source = "lastName", target = "child.childDetail.lastName"),
            @Mapping(source = "dateOfBirth", target = "child.childDetail.dateOfBirth"),
        })
    public User ParentDtoToParent(ParentDto parentDto);
  

我正在使用我在存储每个时使用的相同DTO对象   child detail但是只存储父实体我没有发送任何内容   Json格式的子详细信息值。所以mapstruct自动   为Child属性(名字,姓氏等)分配NULL值   当Hibernate保存对象时,它获得了具有Null值的对象   属性而不是NULL对象