我是Hibernate的新手,我一直在努力在不持久化子实体的情况下持久化父实体(因为它已经持久化并且以前已经加载过)。
我试着在许多不同的网站上找到一些帮助,但没能找到一个明显与我的问题有关的网站。希望你们能帮忙。
想象一下以下场景:
我有一个引用另一个实体(表B)的实体(表A)。
@Entity
@Table(name = "A")
public class TableA implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@Column(name="idtablea")
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@GeneratedValue(generator="IdBGenerator")
@GenericGenerator(name="IdBGenerator", strategy="foreign",
parameters=@Parameter(value="tableB", name="property"))
private int idb;
@OneToOne
@JoinColumn(name = "idtableb", insertable = false, updatable = false)
private TableB tableB;
//other properties
//constructors
//getters and setters
}
TableB实体定义如下:
@Entity
@Table(name = "B")
public class TableB implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@Column(name = "idtableb")
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
//other properties
//constructors
//getters and setters
}
我用TableB实例的引用构造了TableA实例。
现在,我想将TableA持久化到数据库(表A),并将其链接到表B,而不持久化TableB(因为它是在以前的事务中持久化的)。为此,我使用以下代码:
Session session = this.sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.persist(TableA);
tx.commit();
session.close();
每次执行上述代码时,在尝试提交事务时都会引发以下异常:
严重:org.hubinate.TransientObjectException:对象引用未保存的瞬态实例-在之前保存瞬态实例刷新:com.mypackage.TableB
你能帮我理解这里的问题吗?提前谢谢。
我使用的是Java 8、Hibernate 3.6.8和Spring 4.1.5。
我使用的实例的引用构造TableA的实例表B。
你从哪里得到这个TableB实例?您必须使用Hibernate API从数据库中加载它,并将其持久化到另一个事务中(使用get或最好加载,因为您只想设置关系),然后将其设置到表A中的实体中。看起来您正在创建一个新的瞬态对象,然后从表A中将其设置到实体中。由于关系图包含一个瞬态实体,因此会出现此错误。