Сложные отношения JPA - PullRequest
       7

Сложные отношения JPA

0 голосов
/ 08 августа 2011

Мне нужна помощь для построения сложных отношений между следующими таблицами: enter image description here

Вот сценарий: 1) 1 семья имеет N familyTypes (однонаправленный) 2) 1 семья имеет N familyFields (однонаправленный)

РЕДАКТИРОВАТЬ: Первое требование - это семейство "A" имеет определенный список полей семейства, которые могут использоваться в family_types.Например, семейство «А» имеет 4 поля из 20 полей Family_Fields.Теперь каждый член family_type может использовать и настраивать только эти 4 поля семейства, но не другие.Кроме того, теперь каждая семья имеет определенное количество типов семей.В конце я хочу иметь свойство isvisible в семейном поле семейного типа семьи.

Моя проблема заключается в том, что я хочу иметь другое юридическое лицо (объединение 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 голосов
/ 08 августа 2011

Вот ответ, но я не знаю, поможет ли он вам, поскольку зависит, можете ли вы использовать его в своем домене (это может не иметь смысла в вашем домене).

Я думаю, что решением было бы создание троичной ассоциации между Family, FamilyType и FamilyField, и в этой таблице ассоциаций был бы столбец "isVisible".

Таким образом, у вас будет 3 таблицы с только столбцами идентификатора и имени (Family, FamilyType и FamilyField) и другая таблица со следующими полями

  • ID
  • family_id
  • family_type_id
  • family_field_id
  • is_visible

Вы можете сопоставить эту таблицу другим способом и использовать составной ключ, но я думаю, что это может усложнить решение.

Таким образом, вы также гарантируете, что для каждого FamilyField, связанного с Family, существует FamilyType. Хорошее упражнение было бы, если бы вы могли найти репрезентативное имя для этой сущности / таблицы, так как оно должно представлять что-то в домене.

Чтобы упростить навигацию между объектами, вы можете добавить методы в Family, которые извлекают только поля или типы.

...