2015-03-25 67 views
1

我是Hibernate的新手,我一直在努力坚持一个父实体,而不需要坚持一个子实体(因为它已经存在并且之前已经加载)。Hibernate与OneToOne的关系 - 只保留父实体

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

试想以下情形:

我有一个实体(表A)引用其他实体(表B)。

@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", 
      [email protected](value="tableB", name="property")) 
    private int idb; 
    @OneToOne 
    @JoinColumn(name = "idtableb", insertable = false, updatable = false) 
    private TableB tableB; 

    //other properties 

    //constructors 

    //getters and setters 
} 

和表B实体定义如下:

@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 
} 

我构建表A的实例与表B的一个实例的基准。

现在,我想将TableA保存到数据库(表A)并将其链接到表B,而无需保留TableB(因为它在先前的事务中保留)。为此,我现在用的是下面的代码:

严重:org.hibernate.TransientObjectException:对象引用

Session session = this.sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 
session.persist(TableA); 
tx.commit(); 
session.close(); 

每次试图提交事务时执行上面的代码后抛出以下异常一个 未保存的瞬态的实例 - 前 冲洗保存瞬态的实例:com.mypackage.TableB

能不能请帮助我理解的问题 这里? 在此先感谢。

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

回答

1

我构建了TableA的一个实例,引用了一个实例 TableB。

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

+0

谢谢Shailendra。你是对的。我正在创建一个新的对象,而不是加载它。从数据库加载实体后,我设法坚持父实体。 – 2015-03-25 10:59:23