使用OneToOne关系休眠-仅持久化父实体



我是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中将其设置到实体中。由于关系图包含一个瞬态实体,因此会出现此错误。

最新更新