【问题标题】:Hibernate with OneToOne relationship - Persist only the parent Entity具有 OneToOne 关系的休眠 - 仅保留父实体
【发布时间】:2015-03-25 09:50:37
【问题描述】:

我是 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。

【问题讨论】:

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


    【解决方案1】:

    我用一个实例的引用构造了一个 TableA 的实例 表 B。

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

    【讨论】:

    • 谢谢谢伦德拉。你说的对。我正在创建一个新对象而不是加载它。从数据库加载实体后,我设法保留了父实体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多