复杂的JPA关系

时间:2011-08-08 10:40:14

标签: hibernate database-design jpa jpa-2.0

我需要帮助来构建下表之间的复杂关系: enter image description here

以下是该方案: 1)1个族有N个族类型(单向) 2)1个家庭有N个家庭领域(单向)

编辑:第一个要求是一个家庭“A”有一系列家庭字段,可供family_types使用。例如,族“A”在Family_Fields的20个字段中有4个字段。现在,family_type的每个成员只能使用和配置这4个系列字段,而不能使用其他字段。此外,现在每个家庭都有一定数量的家庭类型。最后,我希望在家庭类型的家庭领域拥有无形财产。

我的问题是,我希望有另一个实体(FamilyType + FamilyField的连接),其中一个族字段属于特定的family_type,但还有1个额外的字段(isVisible)。

所以摘录是,家庭x有y型,y有a,b family_fields,其中a是可见的,b对于y型是不可见的。

我试图获取join_table并将其作为带有附加字段的实体类。但它看起来很乱。

还有其他办法吗?所以我喜欢这样:

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_TYPE_ID的外键。而不是其他两个。我在另一个表上也有@OneToMany映射到这个表对应的字段。

以下是架构定义:

enter image description here

为什么没有生成其他两个外国钥匙?任何想法?

1 个答案:

答案 0 :(得分:0)

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

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

所以你会有3个表只有一个id和name列(Family,FamilyType和FamilyField)和另一个包含以下字段的表

  • ID
  • family_id
  • family_type_id
  • family_field_id
  • is_visible

您可以以不同的方式映射此表并使用复合键,但我认为这可能会使解决方案复杂化。

通过这种方式,您还可以确保对于与Family关联的每个FamilyField,都有一个FamilyType。如果你能找到这个实体/表的代表名称,那将是一个很好的练习,因为它应该代表域中的某些东西。

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