java - JPA:如何使用@ElementCollection 注解?

标签 java sql hibernate jpa

我需要你的帮助来映射两个表在 Hibernate 中的关系 @ElementCollection 注释。

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

KEY1         Char      (first primary key field)
KEY2         Char      (second primary key field)
DESCRIPTION  Char
DEPENDENTID  BigInt

第二个是从属表
表名:依赖
数据库列

PARENTID     BigInt    (first primary key field)
CODE         Char      (second primary key field)
FIELD1       Char
FIELD2       Char

我需要使用@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 
}

然后我创建了两个 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
}

以及 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
}

当我尝试部署时出现错误:

Caused by: org.hibernate.MappingException: Foreign key (FK9619C2A17B05CB2:DEPENDENT [iDependentBeans_PARENTID,iDependentBeans_CODE])) must have same number of columns as the referenced primary key (DEPENDENT [PARENTID,iDependentBeans_PARENTID,iDependentBeans_CODE])

所以我做错了什么,但我无法想象是什么。 请问有人愿意帮助我吗?

最佳答案

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

DependentBean 是一个实体。

尝试使用一对多映射并修改您的模式

父架构

KEY1         Char      (PK)
KEY2         Char      (PK)
DEPENDENTID  BigInt    (PK)
DESCRIPTION  Char

依赖模式

CODE         Char      (PK)
PARENTID     BigInt    (FK)
KEY1         Char      (FK)
KEY2         Char      (FK)
FIELD1       Char
FIELD2       Char

一对多映射

父PK

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

父类

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

    @OneToMany(mappedBy = "parent")
    List<DependentBean> iDependentBeans;
}

依赖对象

@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;
}

关于java - JPA:如何使用@ElementCollection 注解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18406516/

相关文章:

java - 在 Has-A 关系中使用 Camel Bindy

java - 为什么在双击和命令提示符时 Java 应用程序的行为不同

java - 如何在groovy中调用java方法

java - 使用更改监听器 javafx 仅选择 TreeView 的子项目(树项目)

java - Hibernate:带有非空列的可选多对一

java - 在 Magnolia CMS 中以编程方式呈现模板区域

sql - SQL Server 中 NVARCHAR 列的排序依据

mysql - 子查询返回多于 1 行

sql - 使用SQLite合并数据

java - Hibernate - 删除链接实体