我有这个实体的消息与具有属性“父母”这个属性也是类型的消息。该是创建父= 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”
我怎么能固定它还是有一个变通?
谢谢!
这个错误告诉了解决方案。要设置与非托管/分离对象的用户依赖。
请确保您填写的信息与用户已在持久化上下文(例如,通过使用回购方式):
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
自我依赖。