Обновление двунаправленного ManyToMany с обеих сторон - PullRequest
3 голосов
/ 25 сентября 2011

ссылаясь на вопрос Сохранение двунаправленной ManyToMany Я хочу получить точно, что принятый ответ объясняют как неправильный:

A a1 = new A();
A a2 = new A();
B b = new B();
a1.getB().add(b);
b.getA().add(a2);

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

a1_id, b_id
a2_id, b_id

Но как при загрузке JPA узнает, что вы намеревались сообщить b только о a2, а не a1?а как насчет a2, который не должен знать о b?

, в моем случае правильно, что b знает об a1 и a2 в КАЖДОЙ ситуации.

подумайте о родительско-дочерних отношениях:

  1. b - родитель a1, а a1 - дочерний элемент b (естественно)

, и для меня ошибочно определять только одно направление:

  1. b является родителем a1, а НЕ a1 является дочерним для b (???)

, чтобы получить объяснения, принятые в ответе. Мне кажется, мне нужны ДВЕ таблицы соединения:

a_has_b:
a1_id, b_id

b_has_a
b_id, a2_id

я не прав ??

  1. однако, как получить "синхронизированное" двунаправленное отношение (не только ManyToMany)?
  2. возможно ли это с помощью стандартных функций JPA?
  3. в противном случае, есть какая-то конкретная реализация провайдера?

Я думаю, что реализация

...
public void addB(A a)
{
    getA().add(a);
    a.getB().add(this);
}

- это действительно уродливый хак ...

ииспользование двух однонаправленных OneToMany с обеих сторон не работает в EclipseLink 2.2.0 (не уверен, я сейчас пытаюсь)

thx:)

Ответы [ 3 ]

2 голосов
/ 09 июля 2013

Использование,

public void addA(A a)
{
    getA().add(a);
    a.getB().add(this);
}

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

Если вы хотите поддерживать отношения отдельно, вам нужно иметь две разные таблицы соединений. Если вы хотите установить одно отношение ManyToMany (кажется, что вам нужно), то вы должны использовать @ManyToMany и установить mappedBy с одной стороны.

См http://en.wikibooks.org/wiki/Java_Persistence/ManyToMany

2 голосов
/ 04 августа 2013

с использованием двух однонаправленных OneToMany добьются цели:

@Entity
@Table
public class A implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id", nullable = false)
    private Long id;

    @OneToMany
    @JoinTable(name="a_b", 
        joinColumns = @JoinColumn(name = "a_id", nullable = false), 
        inverseJoinColumns = @JoinColumn(name = "b_id", nullable = false)
    )
    private List<B> bList = new ArrayList<B>();
}

---------------------------------------------------------------------------------

@Entity
@Table
public class B implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id", nullable = false)
    private Long id;

    @OneToMany
    @JoinTable(name="a_b", 
        joinColumns = @JoinColumn(name = "b_id", nullable = false), 
        inverseJoinColumns = @JoinColumn(name = "a_id", nullable = false)
    )
    private List<A> aList = new ArrayList<A>();
}

Обновление сущности заполнит список

0 голосов
/ 09 июля 2013

Я столкнулся с проблемой при обновлении через несобственную сторону.Я поместил @ManyToMany и @JoinTable с обеих сторон (без карты).Это работает хорошо.Я использую Hibernate 4.1.10.Final.Согласно вики-документам, это не правильно.Смущенный ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...