JPA ElementCollection 外键映射错误

问题描述 投票:0回答:1

我的简单实体类看起来像这样 -

Entity
@Table(name ="my_class", uniqueConstraints = {@UniqueConstraint(name = "AAndBAndCAndD", columnNames = { "A","B","C","D"}) })
public class MyClass implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    @Column(name = "A")
    private String A;

    @Column(name = "B")
    private String B;

    @Column(name = "C")
    private Integer C;

    @Column(name = "D")
    private Integer D;

    @Column(name = "E")
    private Long E;

    @ElementCollection(targetClass = String.class, fetch = FetchType.EAGER)
    @CollectionTable(name="values_table", joinColumns = @JoinColumn(name="my_class_id",       referencedColumnName = "id"))
    @Column(name="values")
    private Set<String> values;

And I created 2 tables like below - 

CREATE TABLE some_table (
    id serial PRIMARY KEY,
    A character varying(10) NOT NULL,
    B character varying(10) NOT NULL,
    C int NOT NULL,
    D int NOT NULL,
    E bigint,
    UNIQUE (A,B,C,D)
);

CREATE TABLE values_table  (
    some_table_id int NOT NULL,
    values VARCHAR(500),
    constraint fk_values_table_some_table
    foreign key (some_table_id) 
    REFERENCES some_table(id)
);

当我将其作为服务的一部分运行时,我看到以下错误

引起:org.hibernate.MappingException:集合外键映射的列数错误:MyClass.values类型:组件[id,id] 在 org.hibernate.mapping.Collection.validate(Collection.java:309) 在 org.hibernate.mapping.Set.validate(Set.java:40) 在 org.hibernate.cfg.Configuration.validate(Configuration.java:1364) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1851) 在org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl $4.perform(EntityManagerFactoryBuilderImpl.java:852) 还有26个

我尝试了不同的方法,但无法修复错误。谁能帮我找出上面的代码有什么问题吗?班级名称

我尝试将 Id 字段添加到值表中,但没有成功。我不明白外键映射有什么问题。

java jpa jpa-2.0
1个回答
0
投票

快速发现代码中的以下错误:

  • MyClass
    应映射到表
    some_table
    但不是
    my_class
  • 集合表中与主表链接的列应该是
    some_table_id
    但不是
    my_class_id

因此将代码更改为以下内容应该可以解决问题:

@Entity
@Table(name ="some_table")
public class MyClass {
  
    @ElementCollection(targetClass = String.class, fetch = FetchType.EAGER)
    @CollectionTable(name="values_table", joinColumns = @JoinColumn(name="some_table_id",referencedColumnName = "id"))
    @Column(name="values")
    private Set<String> values;

}
© www.soinside.com 2019 - 2024. All rights reserved.