object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:com.example.model.Salutation

时间:2016-11-28 22:27:41

标签: java json hibernate spring-mvc

我有两个模型类,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;
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我不是Hibernate的专家,但根据merge() here的文档

  

给定的实例不会与会话相关联。

我建议您在当前Entity中抓取Session,更改字段&#39;值然后冲洗它。

或者,如果是新实体 - save()它。

另外。据我所知,调用Transaction.commit()执行会话刷新,因此无需在

之后手动执行

答案 1 :(得分:0)

我自己解决了这个问题。回答我的问题,以便它可以帮助别人。

问题出在用户下的Salutation对象。致敬已初始化,主要关键是&#39; id&#39;为空。因此,当尝试刷新会话对象时,Salutation的id被发现为null,因此它抛出了这个错误。将null设置为Salutation对象解决了我的问题。