首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

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
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47294277

复制
相关文章

相似问题

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