Hibernate @ManyToOne 调用自己

Posted

技术标签:

【中文标题】Hibernate @ManyToOne 调用自己【英文标题】:Hibernate @ManyToOne calling itself 【发布时间】:2018-05-14 09:43:22 【问题描述】:

我有这个实体消息具有属性“父”这个属性也是消息类型。这是创建一条带有 parent=null 的消息,带有 parent=message 的消息将是一条评论,所以我有一个树消息和 cmets。

@Entity
@Table(name = "message")
public class Message extends BaseModel

    @Id
    @Column(name = "id", updatable = false, nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name="user_id", nullable=false)
    private User user;

    private String text;

    @ManyToOne(fetch = FetchType.EAGER, optional = true)
    @JoinColumn(name = "message_id",nullable = true)
    private Message parent;

但是,当我尝试在此处保存我的实体时,代码:

 Message message = messageRepository.save(
                MapperUtils.getInstance().map(messageDTO,Message.class)
        );

我总是收到这条消息:

org.hibernate.TransientPropertyValueException:非空属性 引用瞬态值 - 瞬态实例必须先保存 当前操作:gara.models.Message.user -> gara.models.User; 嵌套异常是 java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException:非空属性 引用瞬态值 - 瞬态实例必须先保存 当前操作:gara.models.Message.user -> gara.models.User"

我该如何修复它或有解决方法?

谢谢!

【问题讨论】:

【参考方案1】:

错误告诉解决方案。您正在使用非托管/分离对象设置用户依赖项。

确保使用已经在持久性上下文中的用户填充消息(例如使用 repo 方法):

userRepository.getOne(id); // just get the reference

或者,如果用户还没有在数据库中..userRepository.save,或者在关系上设置级联选项:

@ManyToOne(cascade = CascadeType.PERSIST, CascadeType.MERGE)
@JoinColumn(name="user_id", nullable=false)
private User user;

parent 自依赖可能也是同样的情况。

【讨论】:

你说得对,我也看到了这一行: MapperUtils.getInstance().map(messageDTO,Message.class) parse the object without the user->id property so ... there the error

以上是关于Hibernate @ManyToOne 调用自己的主要内容,如果未能解决你的问题,请参考以下文章

防止 Hibernate 加载懒惰的 ManyToOne

Hibernate @ManyToOne引用了一个未知实体

org.hibernate.PersistentObjectException:分离的实体传递给坚持@ManyToOne

为啥在这个 Hibernate 映射中使用 @ManyToOne 而不是 @OneToOne?

Hibernate:具有两个不同的 ManyToOne 关系的子表

Hibernate CriteriaQuery where - ManyToOne 字段