Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate problem @many_to_many / 11 сообщений из 11, страница 1 из 1
24.07.2013, 15:29:17
    #38342336
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem @many_to_many
Всем привет.
Есть такой вот примерно маппинг:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
@Entity
@Table(name = "A")
class A{

Integer id;
List<B> b;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
public Integer getId() {
	return id;
}
setId(Integer id){...}
setB(List<B> b){...}
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinTable(name = "a_b", joinColumns = @JoinColumn(name = "a_id"), inverseJoinColumns = @JoinColumn(name = "b_id"))
	
getB(){...}
}

@Entity
@Table(name = "B")
class B{
Integer id;
List<A> a;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
public Integer getId() {
	return id;
}
setId(Integer id){...}
setA(List<A> a){...}
@ManyToMany(mappedBy = "b", fetch = FetchType.EAGER)
getA(){...}

}



вопроc в следующем:
когда я делаю так:
Код: java
1.
2.
3.
4.
5.
		A a = aDao.findById(aId);
                B b = bDao.findById(bId);
		a.getB().add(b);
		aDao.update(a);
		



в базе данных в промежуточной таблице появляется запись(всё как надо)
если я делаю симметрично:
Код: java
1.
2.
3.
4.
5.
               A a = aDao.findById(aId);
               A a = aDao.findById(aId);
                B b = bDao.findById(bId);
		b.getA().add(a);
		bDao.update(b);



в базе не появляется ничего.

findById реализовано примерно так:
Код: java
1.
2.
3.
4.
5.
6.
7.
 
Session session = sessionFactory.getCurrentSession();
if (Id == null) {
	return null;
}
B b= (b) session.get(b.class, Id);
return b;


Dao.update так:
Код: java
1.
2.
3.
4.
if (b == null) {
	return false;
}
session.update(b);



Вопрос : почему так и как с этим бороться?
...
Рейтинг: 0 / 0
24.07.2013, 15:37:51
    #38342358
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem @many_to_many
В обоих случаях делаете неправильно. Следует всегда добавлять и сохранять с 2 сторон:
Код: java
1.
2.
3.
4.
a.getB().add(b);
b.getA().add(a);
aDao.update(a);
bDao.update(b);


hibernate разберется (в соответсвии с аннотациями) какие запросы сделать, а вот на "клиенте" следует самостоятельно поддержаить целостность данных путем добавления связки в оба списка, поскольку вы имеете дело не с реляционными данными, а с объектами. Это есть в документации
...
Рейтинг: 0 / 0
24.07.2013, 15:41:21
    #38342369
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem @many_to_many
ivanra,

с двух сторон если написать, то пишет что-то про same object

P.S. я не сомневаюсь, что в документации всё есть. У меня конкретный вопрос по конкретному маппингу.
...
Рейтинг: 0 / 0
24.07.2013, 15:53:02
    #38342391
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem @many_to_many
ivanraВ обоих случаях делаете неправильно. Следует всегда добавлять и сохранять с 2 сторон:
Код: java
1.
2.
3.
4.
a.getB().add(b);
b.getA().add(a);
aDao.update(a);
bDao.update(b);


hibernate разберется (в соответсвии с аннотациями) какие запросы сделать, а вот на "клиенте" следует самостоятельно поддержаить целостность данных путем добавления связки в оба списка, поскольку вы имеете дело не с реляционными данными, а с объектами. Это есть в документации

хотя Вы правы - ошибка не в этом.
Если использовать ваш код, то всё то же самое примерно.

только проблема в том, что когда ссылки ставятся навстречу друг другу, невозможно сериализовать этот объект в xml(у меня на самом деле это rest web service). не знаете как решить эту проблему?

ну и вопрос почему всё таки в одну сторону работает, а в другую нет остается открытым
...
Рейтинг: 0 / 0
24.07.2013, 15:56:27
    #38342396
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem @many_to_many
Работая с hibernate, прежде всего забудьте про реляционные данные, тут есть только объекты.
Поэтому единственно правильное решение
Код: java
1.
2.
a.getB().add(b);
b.getA().add(a);


Иначе при сохранении в базу вы получаете непредсказуемый результат.
Конечно, тут лучше иметь меппинг не в List а в Set, но если так нужен List, то к указанным 2 строчкам следует добавить проверку на уже вставленного значения
...
Рейтинг: 0 / 0
24.07.2013, 16:01:54
    #38342411
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem @many_to_many
ivanraРаботая с hibernate, прежде всего забудьте про реляционные данные, тут есть только объекты.
Поэтому единственно правильное решение
Код: java
1.
2.
a.getB().add(b);
b.getA().add(a);


Иначе при сохранении в базу вы получаете непредсказуемый результат.
Конечно, тут лучше иметь меппинг не в List а в Set, но если так нужен List, то к указанным 2 строчкам следует добавить проверку на уже вставленного значения
иначе вылетит авторorg.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: ???
...
Рейтинг: 0 / 0
24.07.2013, 16:03:26
    #38342417
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem @many_to_many
redwhite90,

Потому что вы одну и ту же сущность инстанциируете два раза. Вместо того чтобы для одной сущности использовать один и тот же объект.
...
Рейтинг: 0 / 0
24.07.2013, 16:05:54
    #38342421
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem @many_to_many
хотя у меня на самом деле set и вылетает такая ошибка, если попытаться дважды выполнить вышеуказанный код
...
Рейтинг: 0 / 0
24.07.2013, 16:10:48
    #38342432
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem @many_to_many
Blazkowiczredwhite90,

Потому что вы одну и ту же сущность инстанциируете два раза. Вместо того чтобы для одной сущности использовать один и тот же объект.

а в каком месте я это делаю?
...
Рейтинг: 0 / 0
24.07.2013, 16:19:03
    #38342454
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem @many_to_many
redwhite90а в каком месте я это делаю?
Без понятия. Преведенный выше код лишь не точная проекция вашего кода.
...
Рейтинг: 0 / 0
24.07.2013, 16:29:19
    #38342477
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate problem @many_to_many
redwhite90только проблема в том, что когда ссылки ставятся навстречу друг другу, невозможно сериализовать этот объект в xml(у меня на самом деле это rest web service). не знаете как решить эту проблему?

ну и вопрос почему всё таки в одну сторону работает, а в другую нет остается открытым
С сериализацией в XML разобраться просто: надо поставить соответствующую jaxb аннотацию, чтобы обратная связь не сериализовалась.
А в целом, в many-to-many мэппинге есть основная и инверсная сторона, кто из них кто видно из аннотаций (или из меппинг-файла). Связь будет сохраняться в базу при сохранении основной стороны и не будет сохраняться при сохранении инверсной стороны - так работает hibernate. Поэтому эти знания в принципе можно использовать для того, чтобы убедиться, что данные сохранились. Но результат в целом непредсказуемый: в один прекрасный момент метаданные меняются - и ваша программа перестает работать
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate problem @many_to_many / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]