У меня есть следующий класс
public class ElementBean {
private String link;
private Set<ElementBean> connections;
}
Мне нужно создать таблицу карт, в которой элементы отображаются друг на друга в симметричных отношениях «многие ко многим».
@ManyToMany(targetEntity=ElementBean.class)
@JoinTable(
name="element_elements",
joinColumns=@JoinColumn(name="FROM_ELEMENT_ID", nullable=false),
inverseJoinColumns=@JoinColumn(name="TO_ELEMENT_ID", nullable=false)
)
public Set<ElementBean> getConnections() {
return connections;
}
У меня есть следующие требования
Когда элемент A добавляется в качестве соединения с элементом B, тогда элемент B должен стать соединением элемента A. Поэтому A.getConnections () должен возвращать B, а B.getConnections () должен возвращать A. Я не хочу явным образом создайте 2 записи, одну для отображения A на B и другую для B на A.
Возможно ли это?
ОБНОВЛЕНИЕ: Спасибо за все предложения.
Когда я пытаюсь предложить предложение @ Pascal, две записи создаются следующим образом, когда я пытаюсь соединить элемент 1 с элементом 2.
FROM_ELEMENT_ID, TO_ELEMENT_ID
1, 2
2, 1
Я хочу, чтобы записи были симметричными, где 1,2 равно 2,1
Как решается эта проблема?
Обновление
Я явно создал бин карты
class ConnectionBean {
ElementBean from;
ElementBean to;
}
@NotNull
@ManyToOne
@JoinColumn(name="FROM_ELEMENT_ID", nullable=false)
public ElementBean getFrom() {
return from;
}
@NotNull
@ManyToOne
@JoinColumn(name="TO_ELEMENT_ID", nullable=false)
public ElementBean getTo() {
return to;
}
Я обновил ElementBean до
public class ElementBean {
private String link;
private Set<ConnectionBean> from;
private Set<ConnectionBean> to;
}
@OneToMany(mappedBy="from", fetch=FetchType.LAZY)
public Set<ConnectionBean> getFrom() {
return from;
}
@OneToMany(mappedBy="to", fetch=FetchType.LAZY)
public Set<ConnectionBean> getTo() {
return to;
}
Здесь я могу контролировать вставку и удаление. Например, перед вставкой нового ConnectionBean я проверяю, существует ли соединение между элементами A и B, проверяя в таблице Connection записи, где
((от == A && до == B) || (от == B && до == A))
перед вставкой.