JPA Hibernate。持久的父实体和子实体,在一次调用中使用外键引用父项

时间:2016-08-26 16:10:01

标签: java hibernate jpa

我有以下问题:有一个A类

 Class A {
      ...

      @Id
      @GeneratedValue( strategy = GenerationType.IDENTITY )
      @JsonIgnore
      private Long id;

      @OneToMany(cascade=CascadeType.PERSIST, orphanRemoval = true, fetch = FetchType.EAGER)
      @JsonView(View.Extended.class )
      @JoinColumn(name="b_fkey", referencedColumnName = "id")
      List<B> b;
      ...
 }

和B级:

 Class B {
      ...
      private Long b_fkey;
      ...
 }

我试图坚持如下:

 ...
 A a = new A();
 a.setStuff();
 A aa = aDao.save(a);
 // no list of B's

 for(B b : List<B>) {
     b.setB_fkey(aa.getId());
     bDao.persist(b);
 }
 ...

这很有效,但我希望它以下面的X方式保存:

 ...
 A a = new A();
 a.setStuff();
 a.setB(List<B>)
 aDao.persist(a);
 ...

现在它抛出一个错误“Column'f_key'不能为null”,因为f_key是一个引用尚未生成的a.id值的外键。

问题:如何以“X方式”保存它?

2 个答案:

答案 0 :(得分:1)

我认为你有两个问题:

首先,您要映射双向关系,但只是“半心半意”,即您没有将A映射到B,只映射到它的ID。

更好地映射:

Class B {

  @ManyToOne(...)
  private A a;
}

其次,如果要在Hibernate中映射双向关系,则必须设置双方(参见https://howtoprogramwithjava.com/hibernate-onetomany-bidirectional-relationship/)。

这主要是通过以下方法完成的:

Class A {
   void setB(List<B> bs) {
     this.bs = bs;
     for (B b: bs) {
         b.setA(this);
     }
   }
}

如果B中不需要A,也可以进行单向映射。

答案 1 :(得分:0)

您可以尝试以下代码:

    Class A {
      ...

      @JsonIgnore
      private Long id; @Id
      @GeneratedValue( strategy = GenerationType.IDENTITY )
      public Long getId()
      {
          return id;
      }

      public void setId(Long id)
      {
          this.id = id;
      }

      @JsonView(View.Extended.class )
      List<B> b;

      @OneToMany(cascade=CascadeType.PERSIST, orphanRemoval = true, fetch = FetchType.EAGER)
      @JoinColumn(name="b_fkey")
      public List<B> getB(List<B> bList){
          return b;
      }      

      public void setB(List<B> bList){
          this.b = bList;
      }

getter和setter的注释可以让你更好地控制hibernate列。