Java 将id设置为自动生成到对象中

Java 将id设置为自动生成到对象中,java,oop,jpa,foreign-keys,auto-generate,Java,Oop,Jpa,Foreign Keys,Auto Generate,很抱歉,如果我的帖子被复制了,或者标题没有描述主题,因为我不知道如何在标题中描述,我在互联网上查找,但我没有找到解决方案 我正在使用Java和JPA。下一个问题是: 我有一个带有自动生成密钥的a类: class A{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; private List<B> listB; } 在控制器中,我想创建一个对象a

很抱歉,如果我的帖子被复制了,或者标题没有描述主题,因为我不知道如何在标题中描述,我在互联网上查找,但我没有找到解决方案

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

我有一个带有自动生成密钥的a类:

class A{
      @Id
      @GeneratedValue(strategy=GenerationType.IDENTITY)
      private int id;
      private List<B> listB;
}
在控制器中,我想创建一个对象a,问题是当我创建对象a时,我需要创建对象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;
    ...
}

请参阅示例实现。

我想做$B=new B()$,然后创建一个a列表并将其设置到BI中,但抛出一个错误“javax.persistence.PersistenceException:org.hibernate.id.IdentifierGenerationException:null id generated for:ClassB”。老实说,我不确定您是如何得到这个错误的。如果您可以将代码发布到尝试持久化两个实体(A和B)的位置,这可能会有所帮助。我还尝试使用我在这里发布的代码在我的终端进行设置,包括Oracle(使用sequence generator)和MySQL(使用identity generator)。两个都工作得很好。如果你愿意,你可以在这里下载这个项目(这是JPA Hibernate Eclipse Maven项目):唯一的区别是类A有一个b的列表,我在A中用b的列表迭代并执行em.persist(b_I)请更新你的帖子并显示你的代码来持久化实体A和b的列表,这样我们就可以检查问题所在。谢谢,它工作得很好!问题是我设置错误
@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);