我需要帮助来构建下表之间的复杂关系:
以下是该方案: 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
映射到这个表对应的字段。
以下是架构定义:
为什么没有生成其他两个外国钥匙?任何想法?
答案 0 :(得分:0)
这是一个答案,但我不知道它是否会对您有所帮助,因为它取决于您是否可以在您的域中使用它(这在您的域中可能毫无意义)。
我认为解决方案是在Family,FamilyType和FamilyField之间创建一个三元关联,这个关联表将具有“isVisible”列。
所以你会有3个表只有一个id和name列(Family,FamilyType和FamilyField)和另一个包含以下字段的表
您可以以不同的方式映射此表并使用复合键,但我认为这可能会使解决方案复杂化。
通过这种方式,您还可以确保对于与Family关联的每个FamilyField,都有一个FamilyType。如果你能找到这个实体/表的代表名称,那将是一个很好的练习,因为它应该代表域中的某些东西。
为了简化对象之间的导航,您可以在Family上添加仅检索字段或类型的方法。