具有 OneToOne 关系的 Hibernate - 仅保留父实体

Hibernate with OneToOne relationship - Persist only the parent Entity

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

我试图在许多不同的 Internet 站点上找到一些帮助,但没有找到与我的问题明显相关的帮助。希望大家帮帮忙。

想象一下以下场景:

我有一个引用另一个实体 (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 持久化到数据库 (table A) 并将其 link 持久化到 table B 而不持久化 TableB(因为它在之前的事务中被持久化)。为此,我使用以下代码:

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

每次执行上述代码时,都会在尝试提交事务时抛出以下异常:

Severe: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.mypackage.TableB

你能帮我理解这里的问题吗? 提前致谢。

我正在使用 Java 8、Hibernate 3.6.8 和 Spring 4.1.5。

I construct an instance of TableA with a reference of an instance of TableB.

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