首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在hibernate中通过共享主键保存父实体而不将子实体插入到一对一关系中?

如何在hibernate中通过共享主键保存父实体而不将子实体插入到一对一关系中?
EN

Stack Overflow用户
提问于 2017-11-14 20:03:17
回答 2查看 3.4K关注 0票数 0

在hibernate中,我通过共享主键使用一对一关系,每当我调用save方法插入父实体而不插入子实体时,就会出现以下异常。

代码语言:javascript
运行
复制
org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [com.example.sms.domain.Child.parent]

下面给出了具有父类实体映射的子类实体代码

代码语言:javascript
运行
复制
@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;

在父类实体中,我映射了如下所示的子类实体

代码语言:javascript
运行
复制
@OneToOne(mappedBy="parent", cascade=CascadeType.ALL)
    private Child child;

是否有任何方法只保存父实体而不插入子实体?

EN

回答 2

Stack Overflow用户

发布于 2017-11-14 20:49:14

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

如果我很了解您,那么子实体依赖于父实体,并且它没有自己的身份。因此,不需要为其定义ID属性;因此,Child实体的映射应该如下所示:

代码语言:javascript
运行
复制
@Entity
@Table(name = "t_child")
public class Child {

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

}

Parent实体应该如下所示:

代码语言:javascript
运行
复制
@Entity
@Table(name = "t_parent")
public class Parent {

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

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

    // ...
}

这应该是地图。现在,如果您想保存没有子的父级,请执行以下操作:

代码语言:javascript
运行
复制
Parent parent = new Parent();
// set attribute values
entityManager.persist(parent);

但是,如果您想要保存子表,您应该知道,您必须首先保存父级,因为该子节点依赖于父级,这意味着父级必须存在。

票数 0
EN

Stack Overflow用户

发布于 2017-11-15 22:40:09

最后,过了一天,我自己找到了解决办法。 这个代码是正确的。Mapstruct在将Dto转换为域对象时出现了问题。

代码语言:javascript
运行
复制
@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对象与存储每个子细节时使用的对象相同,但为了存储父实体,我没有发送任何Json格式的子细节值。因此,在Hibernate保存对象时,mapstruct自动将空值分配给Child属性(名字、姓氏等),对象的属性为空值,而不是空对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47294277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档