Java Hibernate:在事务提交和会话关闭之前对保存的对象调用getter

Java Hibernate:在事务提交和会话关闭之前对保存的对象调用getter,java,sql,hibernate,Java,Sql,Hibernate,我有两个Hibernate实体A和B: public class A implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO ) private Integer id; @OneToOne(mappedBy = "a") B b; // ctors, getters, setters } public class B implements Serializable {

我有两个Hibernate实体A和B:

public class A implements Serializable {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO )
  private Integer id;

  @OneToOne(mappedBy = "a")
  B b;

  // ctors, getters, setters
}

public class B implements Serializable {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO )
  private Integer id;

  @OneToOne
  @JoinColumn
  A a;  

  // ctors, getters, setters 
} 
创建和保存这些对象时,我会同时创建这两个对象。创建它们之后,我想调用a.getB(),但它返回null。如果我提交事务,打开一个新会话,并加载a,那么a.getB()将正确返回b

这不起作用:

public void doSave() {
  Session session = getSessionFactoryFromSomewhere.openSession();
  session.beginTransaction();
  A a = new A();
  B b = new B();
  b.setA(a);
  session.save(a);
  session.save(b);

  A aFromDb = (A) session.load(A.class, a.getId());
  B bFromA = aFromDb.getB(); // bFromA is null in this case!
}
这确实有效:

public void doSave() {
  Session session = getSessionFactoryFromSomewhere().openSession();
  Transaction tx = session.beginTransaction();
  A a = new A();
  B b = new B();
  b.setA(a);
  session.save(a);
  session.save(b);

  tx.commit();
  session = getSessionFactoryFromSomewhere().openSession();
  tx = session.beginTransaction();

  A aFromDb = (A) session.load(A.class, a.getId());
  B bFromA = aFromDb.getB(); // bFromA is equal to b, which is correct.
}

如何在不提交事务、关闭会话和启动新会话+事务的情况下使a.getB()返回b?

在两个实体之间的一对一关联中,如果希望从另一个实体获取每个对象而不提交事务或关闭并重新打开会话,您需要向两侧添加对象请尝试以下方法:

 A a = new A();
 B b = new B();
 b.setA(a);
 a.setB(b);

您只需在会话中保存实体之后,但在再次查询数据库以查看更新的实体之前,调用
session.flush()