我有两个模型类,User和Salutation如下。用户表中的外键(salutation_id)是可选的。为了在合并后立即刷新会话对象时保存User对象,我收到以下错误。
对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:com.example.model.Salutation
表格Salutation中的数据已独立于User表插入。当我尝试将salutation_id保存为null的User对象时,它会抛出此错误。
任何帮助都会很明显。
@Entity
@Table(name = "user")
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(unique = true, nullable = false)
private String userName;
@ManyToOne
@JoinColumn(name = "salutation_id")
private Salutation salutationRef;
//Getter and Setter
}
@Entity
@Table(name = "salutation")
public class Salutation implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@ElementCollection
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "salutationRef")
private List<Salutation> salutations;
//Getter and Setter
}
public Object create(Object object) {
Session session = sessionFactory.getCurrentSession();
Transaction txn = session.beginTransaction();
try {
object = (Object) session.merge(object);
session.flush(); //Getting error at this line object references an unsaved transient instance - save the transient instance before flushing: com.example.model.Salutation
txn.commit();
} catch (Exception e) {
txn.rollback();
e.printStackTrace();
}
return object;
}
感谢您的帮助。
答案 0 :(得分:0)
我不是Hibernate的专家,但根据merge()
here的文档
给定的实例不会与会话相关联。
我建议您在当前Entity
中抓取Session
,更改字段&#39;值然后冲洗它。
或者,如果是新实体 - save()
它。
另外。据我所知,调用Transaction.commit()
执行会话刷新,因此无需在
答案 1 :(得分:0)
我自己解决了这个问题。回答我的问题,以便它可以帮助别人。
问题出在用户下的Salutation对象。致敬已初始化,主要关键是&#39; id&#39;为空。因此,当尝试刷新会话对象时,Salutation的id被发现为null,因此它抛出了这个错误。将null设置为Salutation对象解决了我的问题。