Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA:如何使用@ElementCollection注释?_Java_Sql_Hibernate_Jpa - Fatal编程技术网

Java JPA:如何使用@ElementCollection注释?

Java JPA:如何使用@ElementCollection注释?,java,sql,hibernate,jpa,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)

我需要您的帮助,以便在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
第二个是依赖表
表名:相关
数据库列

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:
从属表的类。
注意,在这个类中,我不希望有任何关系注释

@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
}
以及父表的类

@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
}
@实体
@表(name=“PARENT”)
公共类ParentBean实现了可序列化
{
@嵌入ID
ParentPK-iParentPK;
@列(name=“DESCRIPTION”)
私有字符串描述;
@列(name=“DEPENDENTID”)
私人长iDependentId;
@元素集合
@CollectionTable(name=“DEPENDENT”,joinColumns={@JoinColumn(name=“PARENTID”,referencedColumnName=“DEPENDENTID”)})
私有集iDependentBeans=newhashset();
//我省略了构造函数、getter和setter方法
}
当我尝试部署时,出现错误:

原因:org.hibernate.MappingException:外键 (FK9619C2A17B05CB2:从属 [iDependentBeans\u PARENTID,iDependentBeans\u CODE])必须具有相同的 作为引用主键的列数(取决于 [PARENTID,iDependentBeans\u PARENTID,iDependentBeans\u 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
依赖模式

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
一对多映射

ParentPK

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

首先谢谢你的回答。但是我已经看到,当访问父表时,使用onetomany注释Hibernate可以进行连接。只有在访问依赖表的属性时,我才需要访问它。那么,怎么做呢?我认为您使用@OneToMany(fetch=FetchType.EAGER),这肯定会像您所说的那样创建一个连接。尝试使用@OneToMany(fetch=FetchType.LAZY),并确保在关闭会话之前访问该属性。否则,您将得到一个LazyInitializationException.Hi,但是否可以在我的两个表Parent和Dependent之间定义一个OneOmany?正如您所看到的,父表具有字段“DEPENDENTID”,该字段可能链接到依赖表的“PARENTID”字段。依赖表有另一个主键字段:“代码”。这两个表有自己的主键,使用可嵌入类进行描述。那么,在您看来,在这个场景中可以使用@OneToMany注释吗?我尝试了好几种方法,但都没有成功,我尝试了很多搜索,但什么也没找到。提前感谢您的timeHi@user2711522,您的案例不是一对多映射。唯一可能的解决方案是父表的复合键(ID,DEPENDENTID)成为依赖表的复合FK。您好@study,谢谢您的回答。如果我已经很好地理解了:我需要更改依赖表结构,以放置父表主键,然后在依赖表中使用这些字段引用父表,并使用外键。这将成为从属表和父表之间的manytone,manytone关系将在从属pojo中定义。这是正确的吗?但如果是这样,我的父pojo中就没有依赖pojo的集合。还是我错了?