Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JoinTable LazyCollection и множественные вставки / 14 сообщений из 14, страница 1 из 1
11.01.2017, 14:57
    #39382334
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JoinTable LazyCollection и множественные вставки
Добрый день .
Вопрос :
как поправить модель так чтобы не происходило этих каскадных вставок ?
при добавлении нового билета.... ( Ticket ) в массив билетов ShoppingCart


И так есть объектная модель и бизнес код
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
     // положить билет в корзину
        ShoppingCart shoppingCart = basketService.getLastShoppingCartByCurrentUser(user);
        if (shoppingCart == null) {
            
            shoppingCart = new ShoppingCart(user);
        }
//  положили  новый билет
     Ticket ticket = new Ticket(m_ticket);
     basketService.save(ticket);
// добавили в общую корзинку 
    if (ShoppingCartStatus.NEW.equals(shoppingCart.getCartStatus())) {
                shoppingCart.addTicket(ticket);
            }

//тут происходит следующее см sql
            basketService.save(shoppingCart);



sql лог

Код: plsql
1.
2.
3.
4.
5.
Hibernate: insert into `Ticket` (creationDate, `ticketForSale`) values (?, ?)
Hibernate: update ShoppingCart set cartStatus=?, creationDate=?, login=?, phone=? where shoppingCartId=?
Hibernate: delete from ShoppingCartTicket where shoppingCartId=?
Hibernate: insert into ShoppingCartTicket (shoppingCartId, ticketId) values (?, ?)
Hibernate: insert into ShoppingCartTicket (shoppingCartId, ticketId) values (?, ?)



если добавить еще один билет
то так

Код: plsql
1.
2.
3.
4.
5.
6.
Hibernate: insert into `Ticket` (creationDate, `ticketForSale`) values (?, ?)
Hibernate: update ShoppingCart set cartStatus=?, creationDate=?, login=?, phone=? where shoppingCartId=?
Hibernate: delete from ShoppingCartTicket where shoppingCartId=?
Hibernate: insert into ShoppingCartTicket (shoppingCartId, ticketId) values (?, ?)
Hibernate: insert into ShoppingCartTicket (shoppingCartId, ticketId) values (?, ?)
Hibernate: insert into ShoppingCartTicket (shoppingCartId, ticketId) values (?, ?)



каждый раз очищается и добавляется заново коллекция !!!


Модель такая

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
@Entity(name = "ShoppingCart")
 public class ShoppingCart implements Serializable {
     
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long shoppingCartId;

...

    @OneToMany
    @LazyCollection(LazyCollectionOption.FALSE)
    @JoinTable(
                name = "ShoppingCartTicket" , 
                joinColumns = @JoinColumn(name = "shoppingCartId"),
                inverseJoinColumns = @JoinColumn(name = "ticketId"),
                uniqueConstraints= @UniqueConstraint(name = "IDX_CART_TICKET",columnNames={"shoppingCartId", "ticketId"})
                )
    private List<Ticket> tickets = new ArrayList<Ticket>(5);




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Entity(name = "Ticket")
public class Ticket implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ticketId")
    private long ticketId;




таким образом создается три таблицы

Ticket
ShoppingCart
и
ShoppingCartTicket

где ShoppingCartTicket - "расшивочная" - по ключам .

в ней две колонки shoppingCartId и transactionId

создается хибером

есть метод добавления нового билета в корзину

Код: java
1.
2.
3.
4.
5.
6.
    public boolean addTicket(Ticket ticket) {
        if (ShoppingCartStatus.NEW.equals(this.getCartStatus())) {
            return tickets.add(ticket);
        }
        return false;
    
...
Рейтинг: 0 / 0
11.01.2017, 15:35
    #39382384
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JoinTable LazyCollection и множественные вставки
Это же классическая беда из серии n+1

или работа с коллекцией в хибере (сортировка, удаление итд) ?
...
Рейтинг: 0 / 0
11.01.2017, 15:38
    #39382386
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JoinTable LazyCollection и множественные вставки
...
Рейтинг: 0 / 0
11.01.2017, 15:43
    #39382391
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JoinTable LazyCollection и множественные вставки
no56892,

+1

да это оно самое - после НГ немогу найти
автор
Код: plaintext
1.
The bag semantics has the worst performance when it comes to the number of operations since it always re-creates the entire collection. Hibernate issues a delete statement to remove all associations of the old collection from the association table. Then, it issues N inserts to add all associations representing the new collection to the association table. Hibernate does not analyze how many elements have been changed in the collection.
...
Рейтинг: 0 / 0
11.01.2017, 15:45
    #39382394
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JoinTable LazyCollection и множественные вставки
Hibernate Performance Tips: Dirty Collection Effect

https://www.javacodegeeks.com/2012/03/hibernate-performance-tips-dirty.html
...
Рейтинг: 0 / 0
11.01.2017, 15:50
    #39382398
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JoinTable LazyCollection и множественные вставки
no56892Лол, n+1 это о другом.
По теме: http://stackoverflow.com/questions/24580527/hibernate-recreates-join-table-when-adding-to-list

и как жить?

чтобы пересоздания коллекции каждый раз не было ?
...
Рейтинг: 0 / 0
11.01.2017, 15:51
    #39382401
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JoinTable LazyCollection и множественные вставки
Atum1no56892Лол, n+1 это о другом.
По теме: http://stackoverflow.com/questions/24580527/hibernate-recreates-join-table-when-adding-to-list

и как жить?

чтобы пересоздания коллекции каждый раз не было ?

Идея такая - записи в Ticket хранятся

а вот записи в ShoppingCart и ShoppingCartTicket - удаляются после завершения сессии - это
ShoppingCartTicket и ShoppingCart Это удобная абстракция - а Ticket конкретный билет .
...
Рейтинг: 0 / 0
11.01.2017, 15:59
    #39382407
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JoinTable LazyCollection и множественные вставки
Atum1и как жить?
чтобы пересоздания коллекции каждый раз не было ?
Дальше желтенького не осили читать?
Либо сделать ассоциацию двунаправленной - Ticket->Shopping Cart
Либо замапить настоящий список вместо bag. @OrderColumn, вроде.
...
Рейтинг: 0 / 0
11.01.2017, 16:01
    #39382410
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JoinTable LazyCollection и множественные вставки
Дак там же написано, bidirectorial mapping. Сессии чего? транзакции или бизнес-логики? Если первое нафига вообще ее на БД маппить тогда. Если второе, то что мешает отвязать сделав ticket.getShoppingCard().clear() -> save?
...
Рейтинг: 0 / 0
11.01.2017, 17:15
    #39382511
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JoinTable LazyCollection и множественные вставки
BlazkowiczAtum1и как жить?
чтобы пересоздания коллекции каждый раз не было ?
Дальше желтенького не осили читать?
Либо сделать ассоциацию двунаправленной - Ticket->Shopping Cart
Либо замапить настоящий список вместо bag. @OrderColumn, вроде.

да вот нашел , помню что где то в книгах читал ...

https://vladmihalcea.com/2015/05/04/how-to-optimize-unidirectional-collections-with-jpa-and-hibernate/


там все печально
Код: java
1.
2.
3.
4.
Да 
@OrderColumn(name = "index_id")
и 
@Column(name = "path", nullable = false)



и получаем при удалении из корзины кучу update !!! вместо insert с передвижением номера записи в корзине ... даже и не знаешь что круче - удалить все и вставить или проапдейтить ?
...
Рейтинг: 0 / 0
11.01.2017, 17:20
    #39382519
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JoinTable LazyCollection и множественные вставки
Atum1,

@OrderBy не решает?
...
Рейтинг: 0 / 0
11.01.2017, 17:46
    #39382548
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JoinTable LazyCollection и множественные вставки
BlazkowiczAtum1,

@OrderBy не решает?

?
...
Рейтинг: 0 / 0
11.01.2017, 17:57
    #39382562
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JoinTable LazyCollection и множественные вставки
Atum1,

Вместо OrderColumn, в котором хранится индекс, просто использовать OrderBy, тогда не нужно апдейтить все сущности при удалении из списка. Разве нет?
...
Рейтинг: 0 / 0
11.01.2017, 18:39
    #39382616
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JoinTable LazyCollection и множественные вставки
BlazkowiczAtum1,

Вместо OrderColumn, в котором хранится индекс, просто использовать OrderBy, тогда не нужно апдейтить все сущности при удалении из списка. Разве нет?

добавил колонку OrderColumn

вставка отлично отработала на ура - вставляется всегда 1 запись !

безе удаления и пересоздания !

а вот решил из корзины удалить один билет было ( решил удалить не последний а первый )


18:30:26,210 WARN qtp885704837-23 JDBCExceptionReporter:logExceptions:100 - SQL Error: 1062, SQLState: 23000
18:30:26,212 ERROR qtp885704837-23 JDBCExceptionReporter:logExceptions:101 - Duplicate entry '26630-196121' for key 'shoppingCartId'
18:30:26,213 ERROR qtp885704837-23 AbstractFlushingEventListener:performExecutions:324 - Could not synchronize database state with session



org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [update ShoppingCartTicket set ticketId=? where shoppingCartId=? and index_id=?]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

логично ...вроде бы .?!
Код: plsql
1.
2.
3.
4.
5.
	816941 Query	update ShoppingCart set cartStatus='NEW', creationDate='2017-01-11 18:30:26', login=38 where shoppingCartId=26630
		816941 Query	delete from ShoppingCartTicket where shoppingCartId=26630 and index_id=4
		816941 Query	update ShoppingCartTicket set ticketId=196120 where shoppingCartId=26630 and index_id=1
		816941 Query	update ShoppingCartTicket set ticketId=196121 where shoppingCartId=26630 and index_id=2
		816941 Query	update ShoppingCartTicket set ticketId=196122 where shoppingCartId=26630 and index_id=3
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JoinTable LazyCollection и множественные вставки / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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