将 id 自动生成设置为 object

setting an id autogenerate into an object

抱歉,如果我的post重复了,或者标题没有描述主题,因为我不知道如何在标题中描述这个,我在网上查了,但我没有找到解决方案。

我正在使用 Java 和 JPA。问题是下一个:

我有一个 class A 和一个自动生成的密钥:

class A{
      @Id
      @GeneratedValue(strategy=GenerationType.IDENTITY)
      private int id;
      private List<B> listB;
}

并且class B 具有这个类的id:

 class B {
         @EmbeddedId
         private Bid id;
         private String att;
     }
     class Bid {
         private int idA;
         private String text;
     }

我想在控制器中创建一个 object A,问题是当我创建 object A 时,我需要创建 object B,其中 B 的 ID包含自动生成的A的id,它是在实体映射到de数据库的那一刻创建的,我不知道如何将A的自动生成的id设置到idB中,也许我应该查询de数据库询问classA 的 las id 是什么,但它看起来很糟糕。

提前致谢

了解您要解决的一般情况是哪种情况会很有用,因为您使用的结构似乎不必要地复杂。 你真正的目标是什么?

您的案例是派生标识符案例,您的实体 B 的身份是从 A 的主键派生的。对于这种情况,您可以使用 @MapsId 注释,并且您的实体可以像这样重组:

@Entity
public class A {

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

  @OneToMany(mappedBy="a")
  private List<B> listB = new ArrayList<B>();
  ...
}

@Entity
public class B {
    @EmbeddedId
    private BId id;

    @ManyToOne
    @MapsId("idA")
    private A a;
    ...
}

@Embeddable
public class BId {
    private int idA;
    private String att;
    ...
}

这就是持久化实体的方式:

A a = new A();

BId bid = new BId();
bid.setAtt("text"); // notice that the idA attribute is never manually set, since it is derived from A

B b = new B();
b.setId(bid);
b.setA(a);

a.getListB().add(b);

em.persist(a);
em.persist(b);

查看示例实现 here