使用OneToOne关系的Hibernate - 仅保留父实体

时间:2015-03-25 09:50:38

标签: spring hibernate jpa one-to-one hibernate-annotations

我是Hibernate的新手,我一直在努力坚持父实体而不持久化子实体(因为它已经被持久化并且之前已被加载)。

我试图在许多不同的网站上找到一些帮助,但没有运气得到一个明显与我的问题有关的。希望你们能帮忙。

想象一下以下场景:

我有一个引用另一个实体(TableB)的实体(TableA)。

@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.hibernate.TransientObjectException:对象引用一个   未保存的瞬态实例 - 保存之前的瞬态实例   刷新:com.mypackage.TableB

请帮助我理解这个问题? 提前谢谢。

我使用的是Java 8,Hibernate 3.6.8和Spring 4.1.5。

1 个答案:

答案 0 :(得分:1)

  

我构造了一个TableA实例,其中包含一个实例的引用   表B

从哪里获取TableB的这个实例? 您必须从使用Hibernate API在另一个事务中持久化的数据库加载它(使用get或最好load,因为您只想设置关系),然后将其设置为表A中的实体。就像你正在创建一个瞬态的新对象,然后从TableA将其设置为实体。由于关系图包含一个瞬态实体,因此您会收到此错误。