Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Hibernate 两个实体类,中间有一个辅助类_Hibernate_Jpa - Fatal编程技术网

Hibernate 两个实体类,中间有一个辅助类

Hibernate 两个实体类,中间有一个辅助类,hibernate,jpa,Hibernate,Jpa,我在项目中使用JPA2.0和Hibernate。我有一个复杂的场景 类A和类C对应于两个DB表,并通过1:N关系进行链接。然而,在对象模型中,在这两个类之间,有第三个类B不是实体(它是一个util/helper类),因此这个helper类在数据库中没有对应的表 我的对象模型: @Entity public class A { @Id ... id; private B b; } public class B { private List<C> c; } @Ent

我在项目中使用JPA2.0和Hibernate。我有一个复杂的场景

类A和类C对应于两个DB表,并通过1:N关系进行链接。然而,在对象模型中,在这两个类之间,有第三个类B不是
实体
(它是一个util/helper类),因此这个helper类在数据库中没有对应的表

我的对象模型:

@Entity
public class A {
  @Id
  ... id;

  private B b;
}

public class B {
  private List<C> c;
}

@Entity
public class C {
  ...
}
@实体
公共A类{
@身份证
身份证件
私人B,;
}
公共B级{
私人名单c;
}
@实体
公共C类{
...
}
那么,我想知道如何处理这种情况

您可以使用:

@实体
公共A类{
@身份证
身份证件
@嵌入
私人B,;
}
@可嵌入
公共B级{
@独身癖
私人名单c;
}
@实体
公共C类{
...
}

谢谢Tobias。在类B中,我有这样一个属性:private Map attributes=new LinkedHashMap()。所以我这样注释这个属性:@OneToMany@MapKey(name=“id”),其中'id'是C的主键。所以,当我持久化A时,我有以下错误:ora-00972标识符太长;因为hibernate生成这样的查询:插入到a_C(a_ID,attributes_C_ID)值(?,)中。实际上A和C比这(38个字符)长,这就是问题所在。我做得对还是做错了?我不明白为什么hibernate会尝试运行这个查询?我的数据库中没有C表。我在C表中有一个id并停止。不幸的是,这个问题与您的第一个问题不同-在评论部分很难讨论这个问题。你能用所有相关信息创建一个新问题吗?然后你可以在这里添加新问题的链接。谢谢Tobias。就目前而言,你的解决方案是完美的。就目前而言,我所说的问题并不存在,但我可以采取以下措施,但解决方案对我来说并不好。如果我想在所有C类型的子类中持久化A,我如何注释类?这又是一个新问题,但无论如何:您应该使用
@OneToMany(cascade=CascadeType.persist)
@OneToMany(cascade=CascadeType.all)
。它有助于阅读JPA文档(尤其是检查所有注释及其属性)。
@Entity
public class A {
  @Id
  ... id;

  @Embedded
  private B b;
}

@Embeddable
public class B {
  @OneToMany
  private List<C> c;
}

@Entity
public class C {
  ...
}