2015-06-09 2 views
0

У меня есть дерево как структура данных с каким-то сложным рисунком. С абстрактным классом Element существует CompositeElement и SingleElement. Это выглядит так:jpa карта принадлежит «одной» стороне

@Entity 
@DiscriminatorValue("Composite") 
public class CompositeElement extends Element { 

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    @JoinTable(name="Sub_Elements") 
    @MapKeyColumn(name="xxx") 
    protected Map<Integer, Element> subs; 

    ... 
} 

До сих пор отношение было однонаправленным. Он работал хорошо. Но теперь появился случай использования, где мне нужно перейти от вспомогательного элемента к родительскому элементу. Так что я хотел бы сделать это:

@Entity 
@Inheritance 
@DiscriminatorColumn("s_discriminator") 
public class Element { 

    @ManyToOne(mappedBy="subs", fetch=FetchType.LAZY) 
    protected CompositeElement parent; 
    ... 
} 

Но @ManyToOne аннотаций не допускает атрибут «mappedBy».

С точки зрения домена родитель имеет дочерние объекты в структуре данных. А не наоборот. Это также подчеркивается энергичной выборкой и каскадным правилом.

Если право собственности на отношения было на дочерней стороне, то child.setParent (p) не будет работать, потому что здесь я пропускаю ключ для карты.

Есть ли способ сохранить право собственности на отношения на стороне родителя, но все же сделать его двунаправленным?

ответ

0

, похоже, это не возможно, как я хочу.

Я изменил его, так что отношения принадлежат ребенку. И я добавил свойство «childIndex» в классе Element. Это свойство ссылается на @MapKey.

public class CompositeElement extends Element { 

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="parent") 
    @MapKey(name="childIndex") 
    protected Map<Integer, Element> subs; 

и

public abstract class Element { 

    protected Integer childIndex; 

    @ManyToOne(fetch=FetchType.LAZY) 
    protected CompositeElement parent; 

решение работает, но я не люблю его. Мне не нравится дочерний элемент, зная его «childIndex». Когда я повторно заказываю детей в родительском объекте, мне нужно изменить каждого из этих детей. Мне хотелось бы сохранить отдельную таблицу базы данных, представляющую отношение и столбец индекса.

Я предполагаю, что другой вариант состоял бы в моделировании отношения как самой сущности.

+0

Вы, очевидно, не рассказываете нам всю историю.Вся идея переупорядочения детей кажется несовместимой с использованием карты. Пожалуйста, объясните, что вы имеете в виду. – redge

+0

Существует также аннотация @JoinTable, которую вы могли бы исследовать, что может позволить вам делать то, что вы хотите. – redge

+0

Почему переупорядочивание несовместимо с использованием карты? Предположим, у вас есть повестка дня встречи с различными пунктами повестки дня. И затем вы заметите, что вам нужно поменять 2 из них. Моя точка зрения: отдельные пункты повестки дня не меняются, когда вы меняете свою позицию в повестке дня. Ваш вопрос? – EasterBunnyBugSmasher

0

Посмотрите на добавление @JoinColumn аннотацию к вашему @ManyToOne и
javadocs for the @ManyToOne аннотацию.

Обычно mappedby будет работать в другую сторону, где @OneToMany будет mappedby @ManyToOne

+0

ссылка не работает, и тот факт, что mappedBy работает только наоборот, - это то, что я опубликовал в своем вопросе. И я не знаю, как настройка JoinColumn решит мою проблему. – EasterBunnyBugSmasher

+0

@JoinColumn идентифицирует столбец элемента, который является внешним ключом для CompositeElement. – redge

+0

Я думаю, вы пропустили, что у меня нет стандартной коллекции на моей «одной» стороне, а на карте. Я знаю, что у меня могут быть двунаправленные отношения OneToMany с «многими» сторонами, владеющими отношениями. И я знаю, что я могу выбрать столбец базы данных с @JoinColumn. Но если «много» сторона владеет отношениями, как мне установить ключ для записи карты? – EasterBunnyBugSmasher

Смежные вопросы