当前位置: 首页 > 知识库问答 >
问题:

对象引用未保存的临时实例-在刷新之前保存临时实例:com。实例模型打招呼

田普松
2023-03-14

我有两个模型类,用户和问候如下。用户表中的外键(称呼_id)是可选的。为了在合并后立即刷新会话对象时保存用户对象,我得到以下错误信息。

对象引用未保存的临时实例-在刷新之前保存临时实例:com。实例模型打招呼

表中的数据称呼已经独立于用户表插入。当我试图保存salutation_id为空的用户对象时,它会抛出这个错误。

任何帮助都是值得的。

@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个答案

欧阳俊捷
2023-03-14

我自己解决了这个问题。回答我的问题以帮助他人。

这个问题是用户下的称呼对象。称呼初始化时主键“id”为空。所以,当试图刷新会话对象时,发现称呼的id为空,因此抛出了这个错误。将空设置为称呼对象解决了我的问题。

廉元龙
2023-03-14

我不是HiberNate的专家,但根据合并()的文档

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

我建议在当前会话中获取Entity,更改字段的值,然后刷新它。

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

此外。据我所知,调用Transaction.commit()执行会话刷新,因此之后不需要手动执行

 类似资料: