Hibernate的@ManyToOne自称

问题描述 投票:1回答:1

我有这个实体的消息与具有属性“父母”这个属性也是类型的消息。该是创建父= NULL,并与家长的消息的消息=消息将是一个评论,所以后来我有一棵树的消息和评论。

@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”

我怎么能固定它还是有一个变通?

谢谢!

java hibernate spring-boot jpa orm
1个回答
1
投票

这个错误告诉了解决方案。要设置与非托管/分离对象的用户依赖。

请确保您填写的信息与用户已在持久化上下文(例如,通过使用回购方式):

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自我依赖。

© www.soinside.com 2019 - 2024. All rights reserved.