【问题标题】:JPA with Hibernate 4.x, @ElementCollection, Primary Key带有 Hibernate 4.x、@ElementCollection、主键的 JPA
【发布时间】:2015-06-30 02:21:43
【问题描述】:

我正在将 JPA 与 Hibernate 4.x. 和 postgresql 9.x 一起使用,但我想知道一些问题。

当使用@ElementCollection注解,并且我配置了Set类型嵌入字段时,我希望生成可嵌入集合表的主键,但是它不起作用。我只能找到一个针对关系所有者的外键。我想知道为什么它不生成主键。这是我的测试代码。 A.java

@Entity
public class A {
    @Id
    private Long id;
    @Column(name = "\"as\"")
    private String as;
    public String getAs() {
        return as;
    }

    public void setAs(String as) {
        this.as = as;
    }

    @ElementCollection
    private Set<B> bs = new HashSet<>();

    public Long getId() {
        return id;
    }

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

    public Set<B> getBs() {
        return bs;
    }

    public void setBs(Set<B> bs) {
        this.bs = bs;
    }
}

B.java

@Embeddable
public class B {
    private String col1;
    private String col2;

    public String getCol1() {
        return col1;
    }

    public void setCol1(String col1) {
        this.col1 = col1;
    }

    public String getCol2() {
        return col2;
    }

    public void setCol2(String col2) {
        this.col2 = col2;
    }
}

结果是

Hibernate: 
    create table A (
        id int8 not null,
        "as" varchar(255),
        primary key (id)
    )
Hibernate: 
    create table A_bs (
        A_id int8 not null,
        col1 varchar(255),
        col2 varchar(255)
    )
Hibernate: 
    alter table A_bs 
        add constraint FK_rcecll1ao3brmwwnsep3iqq3p 
        foreign key (A_id) 
        references A

告诉我为什么它没有生成主键? 先谢谢了~

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    因为@ElementCollection用于映射简单元素的集合,与实体不同。他们唯一需要的是对 Hibernate 正确生成的拥有实体的引用(列 A_id 和外键 (A_id) references A)。请查看this post 了解更多信息。

    如果您确实需要可嵌入对象中的主键,请考虑将其设为适当的实体。

    【讨论】:

    • 是的,我知道你的意思。但我想使用 ElementCollection 来映射你所说的简单元素的集合。正如你所看到的,B 类不是实体,只是简单的类型类附加嵌入式注释。我想知道它是否会生成 A_bs 集合表的复合主键(A_id,col1,col2)。我希望生成主键,但事实并非如此。我想知道为什么。在几本 JPA 书籍中使用 ElementCollection 时,我可以看到生成主键。
    • 我使用 java.util.Set 类型作为附加 @ElementCollection 注释的类字段。然后我希望生成 PK,因为它们必须是唯一的。谢谢
    • 您在哪些 JPA 书籍中看到了这一点?你读过这个吗? en.m.wikibooks.org/wiki/Java_Persistence/…
    • 不,我读的书是 ProJPA 2nd edition。在Chap5中,有一个示例代码@ElementCollection private Set&lt;String&gt; nicknames,作者展示了结果ERD图。该图显示 EMPLOYEE_NICKNAMES 表具有复合主键(employee_id,昵称)。另外,《Java persistence with Hibernate》一书的内容也与使用Set Type字段的内容相同。
    • 我认为是正确的。如果我们使用@ElementCollection注解的基本类型的Set类型字段,ORM需要制作复合主键(目标实体fk +目标的其他列),以免在数据库中产生重复的行。但是,我可以看到不要进行 PK,只是通过 ORM 框架对集合表进行 FK。
    【解决方案2】:

    要为像Set这样的可嵌入集合生成主键,需要用注解@Column(nullable = false)标记可嵌入类的所有列,因为要求可空字段不能是复合主键的一部分

    【讨论】:

      猜你喜欢
      • 2016-11-10
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 2011-02-18
      • 2012-09-02
      相关资源
      最近更新 更多