powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA OneToMany
8 сообщений из 33, страница 2 из 2
JPA OneToMany
    #37825211
Vladmir K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про 12662526 никто не прокомментирует?..
...
Рейтинг: 0 / 0
JPA OneToMany
    #37835114
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladmir Kkrab,
Код: java
1.
2.
this.region.setCities(listOfPickCities);
em.merge(this.region);


Если дебаг показывает, что listOfPickCities и region изменились, а нет инсерта, то давай лог в студию.
(<property name="hibernate.show_sql" value="true"/>)

Блин, ребята! Такая же трабла, не могу сохранить коллекцию сущностей! CascadeType.PERSIST указал с двух сторон, всё равно не сохраняет данные!
...
Рейтинг: 0 / 0
JPA OneToMany
    #37835175
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мгу только посоветовать в стиле приведенной тобой цитаты: "Если дебаг показывает, что ... и ... изменились, а нет инсерта, то давай лог в студию".
...
Рейтинг: 0 / 0
JPA OneToMany
    #37835225
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот что я узнал:


авторТогда для чево вобще затевать этот весь цырк с листами?
Я то думал что они будут удобны при выборке, типа выбрать несколько книг по одному автору. Хотя оно и есть в некой мере удобно.
Но если например надо сменить книге автора, то надо удалять, потом добавлять в новый список...
Короч что-то розработчики не прощитали.
Если child поменял своего parent, то списки в parent по идее должны сами обновлятся.

Или это не очевидно, или я не понимаю какой-то сути?



Ответ:
авторВ EJB 2.x так и было. Там было полное управление связями. Работало медленно, в JPA от этого отказались.
...
Рейтинг: 0 / 0
JPA OneToMany
    #37835662
Vladmir K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>Но если например надо сменить книге автора, то надо удалять, потом добавлять в новый список...

>>Или это не очевидно, или я не понимаю какой-то сути?

В том то и дело, что не в новый: anEntity.getList().addItem(aNewItem); em.merge( anEntity); сгенрит только один инсерт, вставляя только один новый элемент листа. Конечно, все зависит от реализации jpa. Hiber так делает.
...
Рейтинг: 0 / 0
JPA OneToMany
    #37835748
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IDVsbruck,
Делаем на EclipseLink. Собираем NetBeans и деплоим на GlassFish
авторFINER: client acquired: 19781789
FINER: TX binding to tx mgr, status=STATUS_ACTIVE
FINER: acquire unit of work: 15217460
FINEST: Execute query ReadObjectQuery(name="readObject" referenceClass=Role sql="SELECT idRole, Name FROM tvipusk.role WHERE (idRole = ?)")
FINEST: Register the existing object ru.p03.tvipusk.persistence.Role[ idRole=3 ]
FINER: TX beforeCompletion callback, status=STATUS_ACTIVE
FINER: begin unit of work commit
FINER: TX afterCompletion callback, status=COMMITTED
FINER: end unit of work commit
FINER: release unit of work
FINER: client released
FINER: client acquired: 27534382
FINER: TX binding to tx mgr, status=STATUS_ACTIVE
FINER: acquire unit of work: 21199645
FINEST: Merge clone with references ru.p03.tvipusk.persistence.Appuser[ id=51 ]
FINEST: Register the existing object ru.p03.tvipusk.persistence.Role[ idRole=2 ]
FINER: TX beforeCompletion callback, status=STATUS_ACTIVE
FINER: begin unit of work commit
FINER: TX beginTransaction, status=STATUS_ACTIVE
FINEST: Execute query UpdateObjectQuery(ru.p03.tvipusk.persistence.Appuser[ id=51 ])
FINER: TX afterCompletion callback, status=COMMITTED
FINER: end unit of work commit
FINER: release unit of work
FINER: client released


Код: 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.
public class Appuser implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Basic(optional = false)
    @NotNull
    @Column(name = "id")
    private Integer id;
    ....
    @ManyToMany(mappedBy = "appuserList", fetch = FetchType.LAZY, cascade={CascadeType.MERGE})
    private List<Role> roleList;
    ...
}

public class Role implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    //@Basic(optional = false)
    //@NotNull
    @Column(name = "idRole")
    private Integer idRole;
    ...
    @JoinTable(name = "user_has_role", joinColumns = {
        @JoinColumn(name = "Role_idRole", referencedColumnName = "idRole")},     inverseJoinColumns = {
        @JoinColumn(name = "AppUser_id", referencedColumnName = "id")})
    @ManyToMany(fetch = FetchType.LAZY, cascade={CascadeType.MERGE})
    private List<Appuser> appuserList;
    ...
    ...
}



Получается тут ситуация как на прикрепленном файле. Сгенерировали классы и увидели что промежуточная таблица "user_has_role" не сгенерировалась! Поэтому встал вопрос как её заполнять!?
...
Рейтинг: 0 / 0
JPA OneToMany
    #37835750
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladmir K,

...
Рейтинг: 0 / 0
JPA OneToMany
    #37835792
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НиколахаIDVsbruck,
Делаем на EclipseLink. Собираем NetBeans и деплоим на GlassFish
авторFINER: client acquired: 19781789
FINER: TX binding to tx mgr, status=STATUS_ACTIVE
FINER: acquire unit of work: 15217460
FINEST: Execute query ReadObjectQuery(name="readObject" referenceClass=Role sql="SELECT idRole, Name FROM tvipusk.role WHERE (idRole = ?)")
FINEST: Register the existing object ru.p03.tvipusk.persistence.Role[ idRole=3 ]
FINER: TX beforeCompletion callback, status=STATUS_ACTIVE
FINER: begin unit of work commit
FINER: TX afterCompletion callback, status=COMMITTED
FINER: end unit of work commit
FINER: release unit of work
FINER: client released
FINER: client acquired: 27534382
FINER: TX binding to tx mgr, status=STATUS_ACTIVE
FINER: acquire unit of work: 21199645
FINEST: Merge clone with references ru.p03.tvipusk.persistence.Appuser[ id=51 ]
FINEST: Register the existing object ru.p03.tvipusk.persistence.Role[ idRole=2 ]
FINER: TX beforeCompletion callback, status=STATUS_ACTIVE
FINER: begin unit of work commit
FINER: TX beginTransaction, status=STATUS_ACTIVE
FINEST: Execute query UpdateObjectQuery(ru.p03.tvipusk.persistence.Appuser[ id=51 ])
FINER: TX afterCompletion callback, status=COMMITTED
FINER: end unit of work commit
FINER: release unit of work
FINER: client released


Код: 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.
public class Appuser implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Basic(optional = false)
    @NotNull
    @Column(name = "id")
    private Integer id;
    ....
    @ManyToMany(mappedBy = "appuserList", fetch = FetchType.LAZY, cascade={CascadeType.MERGE})
    private List<Role> roleList;
    ...
}

public class Role implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    //@Basic(optional = false)
    //@NotNull
    @Column(name = "idRole")
    private Integer idRole;
    ...
    @JoinTable(name = "user_has_role", joinColumns = {
        @JoinColumn(name = "Role_idRole", referencedColumnName = "idRole")},     inverseJoinColumns = {
        @JoinColumn(name = "AppUser_id", referencedColumnName = "id")})
    @ManyToMany(fetch = FetchType.LAZY, cascade={CascadeType.MERGE})
    private List<Appuser> appuserList;
    ...
    ...
}



Получается тут ситуация как на прикрепленном файле. Сгенерировали классы и увидели что промежуточная таблица "user_has_role" не сгенерировалась! Поэтому встал вопрос как её заполнять!?

Проблему решил путем перерегенерацией ENTITY классов Eclips'ом Helios . После этого в логах стало видно что генерируется как бы два запроса один на insert в таблицу Appuser , а второй на insert в user_has_role

Код: sql
1.
2.
3.
4.
FINE: SELECT IDROLE, Name FROM role
FINE: INSERT INTO user_has_role (Role_idRole, AppUser_id) VALUES (?, ?)
	bind => [1, 51]
FINE: SELECT IDROLE, Name FROM role
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA OneToMany
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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