Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠:如果引用不存在,则保存该引用_Java_Hibernate_Merge - Fatal编程技术网

Java 休眠:如果引用不存在,则保存该引用

Java 休眠:如果引用不存在,则保存该引用,java,hibernate,merge,Java,Hibernate,Merge,我有以下课程: @Entity public class ClassA { @Column @Id private Long id; @ManyToOne(cascade = javax.persistence.CascadeType.ALL) @JoinColumn... private ClassB classB; public ClassA(ClassB classB){ this.classB = classB; } //.... //..

我有以下课程:

@Entity
public class ClassA {
  @Column
  @Id
  private Long id;
  @ManyToOne(cascade = javax.persistence.CascadeType.ALL)
  @JoinColumn...
  private ClassB classB;
  public ClassA(ClassB classB){
    this.classB = classB;
  }
  //....
  //....
}

@Entity
public class ClassB {
  @Column
  @Id
  private Long id;

  @Column(unique=true) //important
  private String name;
  public ClassB(String name){
    this.name = name;
  }
  //....
  //....
}
仅当
ClassB
不存在时,我才想保存
ClassA
ClassB

ClassB b = new ClassB("myName");
ClassA a = new ClassA(b);
session.merge(a); // fine
ClassA a2 = new ClassA(b);
session.merge(a2); // problem with b

当然,我可以检查
ClassB
是否存在并加载它,但我希望这样做更有效。

如果存在ClassB并且管理了ClassB,那么getEntityManager.contains(b)返回true

ClassB b = new ClassB("myName");

    if(getEntityManager.contains(b)){
   ClassA a = new ClassA(b)
    session.merge(a);
    }
   else{
    session.merge(b);
    ClassA a = new ClassA(b)
    session.merge(b);
     }

contains(obj)
仅测试对象是否存在于当前会话中,或者是否存在于当前持久性上下文EntityManager中。它不会查询数据库以查看具有该ID的对象是否已经存在。为什么要先保存ClassB。如果保存成功,那么您可以使用ClassB作为参数创建ClassA并保存ClassA。这是我的想法。可能对您有所帮助。我认为这会起作用:
ClassB=hibernateSession.merge(新ClassB(“myName”);合并(新的ClassA(b))但它没有。还有其他更好的主意吗?:)