java - Hibernate @ManyToOne 调用自身

标签 java hibernate spring-boot jpa orm

我有这个实体消息,其属性为“parent”,该属性也是消息类型。创建一 strip 有parent=null的消息,带有parent=message的消息将是一条注释,所以我有一个树消息和注释。

@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: Not-null property references a transient value - transient instance must be saved before current operation : gara.models.Message.user -> gara.models.User; nested exception is java.lang.IllegalStateException:
org.hibernate.TransientPropertyValueException: Not-null property
references a transient value - transient instance must be saved before current operation : gara.models.Message.user -> gara.models.User"

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

谢谢!

最佳答案

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

确保使用持久化上下文中已有的用户填充消息(例如通过使用 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自依赖上。

关于java - Hibernate @ManyToOne 调用自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47573842/

相关文章:

java - 即使手机没有使用,我也可以从配对的arduino接收蓝牙信号到Android应用程序中吗?(比如保存在口袋里)

java - 如何在 Primefaces 2.2.1 中为 JSF2 自定义终端组件?

hibernate - 脏读在 hibernate 中如何工作

spring-boot - Spring Boot - 使用 Flyway 和 H2 数据库进行测试

java - 从 JTable 打印用户指定的列

java - 获取异常 : org. hibernate.exception.sqlgrammarexception

java - 如何将参数传递给 Hibernate 的 subselect 标签?

java - Spring Boot 的 Cucumber 测试可以在 "mvn test"中运行,但不能在 "mvn verify"中运行

java - 如何避免在 Spring Boot 应用程序中写入显式端口号 (8443)

java - 比较器 comparingInt