JPA:如何使用@ElementCollection注释?

gpe*_*ini 5 java sql hibernate jpa

我需要你的帮助,使用@ElementCollection注释在两个表的Hibernate中映射关系.

第一个是父
表表名:
数据库列

KEY1         Char      (first primary key field)
KEY2         Char      (second primary key field)
DESCRIPTION  Char
DEPENDENTID  BigInt
Run Code Online (Sandbox Code Playgroud)

第二个是依赖表
TableName:Dependent
DB Columns

PARENTID     BigInt    (first primary key field)
CODE         Char      (second primary key field)
FIELD1       Char
FIELD2       Char
Run Code Online (Sandbox Code Playgroud)

我需要使用@EmbeddedId注释为两个表定义PK,所以我创建了两个类:

@Embeddable
public class ParentPK implements Serializable
{
   @Column(name="K1")
   private String iK1;
   @Column(name="K2")
   private String iK2;
  // I omit the constructor, getter, setter, equals, hashcode method 
}

@Embeddable
public class DependentPK implements Serializable
{
  @Column(name="PARENTID")
  private String iParentId;
  @Column(name="CODE")
  private String iCode;
  // I omit the constructor, getter, setter, equals, hashcode method 
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了两个bean:
DEPENDENT表的类.
请注意,在这个类中,我不希望有任何关系注释

@Entity
@Table(name = "DEPENDENT")
public class DependentBean implements Serializable
{
   @EmbeddedId
   private DependentPK iDependentPK;
   @Column(name = "FIELD1")
   private String iField1;
   @Column(name = "FIELD2")
   private String iField2;
   // I omit the constructor, getter, setter methods
}
Run Code Online (Sandbox Code Playgroud)

和PARENT表的类

@Entity
@Table(name = "PARENT")
public class ParentBean implements Serializable
{
   @EmbeddedId
   ParentPK iParentPK;
   @Column(name = "DESCRIPTION")
   private String iDescription;
   @Column(name = "DEPENDENTID")
   private long iDependentId;
   @ElementCollection
   @CollectionTable(name="DEPENDENT", joinColumns={@JoinColumn(name="PARENTID",  referencedColumnName="DEPENDENTID")})
   private Set<DependentBean> iDependentBeans = new HashSet<DependentBean>();
   // I omit the constructor, getter, setter methods
}
Run Code Online (Sandbox Code Playgroud)

当我尝试部署时,我收到了错误:

引起:org.hibernate.MappingException:外键(FK9619C2A17B05CB2:DEPENDENT [iDependentBeans_PARENTID,iDependentBeans_CODE]))必须与引用的主键具有相同的列数(DEPENDENT [PARENTID,iDependentBeans_PARENTID,iDependentBeans_CODE])

所以我做错了什么,但我无法想象.有人可以帮我吗?

stu*_*udy 8

@ElementCollection应与基本类型或可嵌入类一起使用,而不是与实体一起使用.

DependentBean是一个实体.

尝试使用"一对多"映射并修改架构

PARENT模式

KEY1         Char      (PK)
KEY2         Char      (PK)
DEPENDENTID  BigInt    (PK)
DESCRIPTION  Char
Run Code Online (Sandbox Code Playgroud)

相关模式

CODE         Char      (PK)
PARENTID     BigInt    (FK)
KEY1         Char      (FK)
KEY2         Char      (FK)
FIELD1       Char
FIELD2       Char
Run Code Online (Sandbox Code Playgroud)

一对多映射

ParentPK

@Embeddable
public class ParentPK {
    @Column(name = "K1")
    private String iK1;
    @Column(name = "K2")
    private String iK2;
    @Column(name = "DEPENDENTID")
    private long iDependentId;
}
Run Code Online (Sandbox Code Playgroud)

ParentBean

@Entity
@Table(name = "PARENT")
public class ParentBean {
    @EmbeddedId
    ParentPK iParentPK;

    @OneToMany(mappedBy = "parent")
    List<DependentBean> iDependentBeans;
}
Run Code Online (Sandbox Code Playgroud)

DependentBean

@Entity
@Table(name = "DEPENDENT")
public class DependentBean {
    @Id
    @Column(name = "CODE")
    private String iCode;

    @ManyToOne
    @JoinColumns({ 
      @JoinColumn(name = "PARENTID", referencedColumnName = "iDependentId"),  
      @JoinColumn(name = "K1", referencedColumnName = "iK1"),
      @JoinColumn(name = "K2", referencedColumnName = "iK2") })
    ParentBean parent;
}
Run Code Online (Sandbox Code Playgroud)