【问题标题】:Complex JPA relationship复杂的 JPA 关系
【发布时间】:2011-08-08 10:40:13
【问题描述】:

我需要帮助来建立下表之间的复杂关系:

这是场景: 1) 1 个 Family 有 N 个 familyTypes(单向) 2)1个家庭有N个familyFields(单向)

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

我的问题是,我想要另一个实体(FamilyType+FamilyField 的连接),其中一个家庭字段属于特定的 family_type,但还有 1 个附加字段 (isVisible)。

所以摘录是,family 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,它被映射到这个表对应的字段。

这是架构定义:

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

【问题讨论】:

  • 在一个给定的 Family 中,你能有一个没有 FamilyField 的 FamilyType 吗?反过来也一样,在一个给定的家庭中,你能有一个没有家庭类型的家庭字段吗?
  • 不,不能。第一个要求是家庭“A”有一个特定的家庭字段列表,可供family_types使用。例如,家庭“A”在 Family_Fields 的 20 个字段中有 4 个字段。现在,family_type 的每个成员只能使用和配置这 4 个家庭字段,不能使用和配置其他字段。而且,现在每个家族都有一定数量的家族类型。最后,我想在家庭类型的家庭字段上拥有 isvisible 属性。

标签: hibernate database-design jpa jpa-2.0


【解决方案1】:

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

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

因此,您将拥有 3 个表,其中只有一个 id 和 name 列(Family、FamilyType 和 FamilyField),另一个表具有以下字段

  • 身份证
  • family_id
  • family_type_id
  • family_field_id
  • is_visible

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

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

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

【讨论】:

  • 感谢您的帮助。让我试试这个,我会跟进。
猜你喜欢
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 2021-10-12
相关资源
最近更新 更多