Hibernate 复杂的JPA关系

Hibernate 复杂的JPA关系,hibernate,database-design,jpa,jpa-2.0,Hibernate,Database Design,Jpa,Jpa 2.0,我需要帮助在以下表格之间建立复杂关系: 以下是场景: 1) 1个族有N个族类型(单向) 2) 1个家庭有N个家庭字段(单向) 编辑:第一个要求是族“a”具有可由族类型使用的特定族字段列表。例如,族“A”在族_字段的20个字段中有4个字段。现在,族类型的每个成员只能使用和配置这4个族字段,不能使用和配置其他字段。此外,现在每个族都有一定数量的族类型。最后,我希望在family type of family的family字段上具有isvisible属性 我的问题是,我希望有另一个实体(Family

我需要帮助在以下表格之间建立复杂关系:

以下是场景: 1) 1个族有N个族类型(单向) 2) 1个家庭有N个家庭字段(单向)

编辑:第一个要求是族“a”具有可由族类型使用的特定族字段列表。例如,族“A”在族_字段的20个字段中有4个字段。现在,族类型的每个成员只能使用和配置这4个族字段,不能使用和配置其他字段。此外,现在每个族都有一定数量的族类型。最后,我希望在family type of family的family字段上具有isvisible属性

我的问题是,我希望有另一个实体(FamilyType+FamilyField的联接),其中一个族字段属于特定的族类型,但还有一个附加字段(可见)

所以摘录是,族x有y类型,而y有a,b族_字段,其中a对于类型y可见,b不可见

我尝试获取join_表,并使其成为带有附加字段的实体类。但它看起来一团糟

还有别的办法吗?所以我喜欢这样:

Family f = getFamily("X");
FamilyTypes ft = f.getTypes();
FamilyFields ff = f.getFields(); 
SomeEntity = ft.getFieldConfiguarations(); // problem is hwo to do this
我不能在FamilyType中添加该字段,因为许多其他FamilyType都可以使用该字段

我感到困惑:(


好的,经过一些尝试后,我开始学习以下课程:

@Entity
@IdClass(FieldConfiguarationPk.class)
public class FieldConfiguaration implements Serializable{

@Id
@Column(name = "FAMILY_ID")
private Long familyId;

@Id
@Column(name = "FAMILY_TYPE_ID")
private Long familyTypeId;


@Id
@Column(name = "FAMILY_FIELD_ID")
private Long familyFieldId;


@Column(name = "REQUIRED")
private boolean isRequired;

@Column(name = "HELP")
private boolean isHelpAvailable;


@ManyToOne
@JoinColumn(name = "FAMILY_ID", insertable = false, updatable = false, referencedColumnName ="Id")
private Family family;

@ManyToOne
@JoinColumn(name = "FAMILY_TYPE_ID", insertable = false, updatable = false, referencedColumnName = "Id")
private FamilyType familyType;

@ManyToOne
@JoinColumn(name = "FAMILY_FIELD_ID", insertable = false, updatable = false, referencedColumnName = "Id")
private FamilyField familyField;
/*getter,setter*/
但我的问题是,只创建了带有
FAMILY\u TYPE\u ID
的外键,而不是其他两个。我还在另一个表上创建了
@OneToMany
,该表由相应的字段映射

以下是模式定义:


为什么没有生成其他两个外键?有什么想法吗?

这里有一个答案,但我不知道它是否会帮助您,因为这取决于您是否可以在您的域中使用它(这在您的域中可能没有意义)

我认为解决方案是在Family、FamilyType和FamilyField之间创建一个三元关联,这个关联表将有“isVisible”列

因此,您将有3个表,其中只有一个id和名称列(Family、FamilyType和FamilyField),另一个表包含以下字段

  • 身份证
  • 家庭id
  • 家庭类型id
  • 家庭\字段\ id
  • 你看得见吗
您可以以不同的方式映射此表并使用复合键,但我认为这可能会使解决方案复杂化

通过这种方式,您还可以确保与族关联的每个FamilyField都有一个FamilyType。一个好的练习是,如果您可以找到此实体/表的代表性名称,因为它应该代表域中的某些内容


为了简化对象之间的导航,可以在族上添加只检索字段或类型的方法。

在给定的族中,可以有一个不带FamilyField的FamilyType吗?反过来,在给定的族中,可以有一个不带FamilyType的FamilyField吗?不可以。第一个要求是族“a”具有可由族类型使用的特定族字段列表。例如,族“a”在20个Family_字段中有4个字段。现在,Family_类型的每个成员只能使用和配置这4个家族字段,而不能配置其他字段。此外,现在每个家族都有一定数量的家族类型。最后,我希望在Family类型的家族字段上有isvisible属性。感谢您的帮助。让我尝试一下,我会跟进.