【问题标题】:setting an id autogenerate into an object将 id 自动生成到对象中
【发布时间】:2015-10-09 17:33:25
【问题描述】:

对不起,如果我的帖子被重复或标题没有描述主题,因为我不知道如何在标题中描述这个,我在互联网上查找,但我没有找到解决方案。

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

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

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

还有这个类的 id 的 B 类:

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

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

提前致谢

【问题讨论】:

    标签: java oop jpa foreign-keys auto-generate


    【解决方案1】:

    您的案例是派生标识符案例,其中您的实体 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

    【讨论】:

    • 我试过这个,但抛出一个错误“ javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: null id generated for:ClassB”
    • 老实说,我不确定你是如何得到这个错误的。如果您可以在尝试保留两个实体(A 和 B)的位置发布代码,这可能会有所帮助。我还尝试使用我在此处发布的代码进行设置,包括 Oracle(使用序列生成器)和 MySQL(使用身份生成器)。两者都工作得很好。如果你愿意,你可以在这里下载项目(它是 JPA Hibernate Eclipse Maven 项目):drive.google.com/file/d/0B4STeDDZx9s_X01RMFIzVzNvYU0/…
    • 唯一的区别是A类有一个b列表,我用a中的b列表迭代并做em.persist(b_i)
    • 请更新您的帖子并显示您的代码以持久化两个实体 - A 和 B 列表,以便我们检查问题所在。
    • 感谢 Ish,它运行良好!问题是我设置错了
    【解决方案2】:

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

    【讨论】:

    • 我想做 $B = new B()$ 然后创建一个 A 列表并设置到 B 中
    猜你喜欢
    • 2016-01-22
    • 1970-01-01
    • 2011-01-11
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2021-10-30
    相关资源
    最近更新 更多