我在hibernate中通过共享主键使用一对一关系, 每当我调用save方法插入父实体而没有对子实体进行干扰时,我得到以下内容 例外
org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [com.example.sms.domain.Child.parent]
具有父类实体映射的子类实体的代码是 如下所示
@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;
有没有办法只保存父实体而不插入子实体?
答案 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对象