powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / HibernateTemplate странное поведение при коммите
18 сообщений из 18, страница 1 из 1
HibernateTemplate странное поведение при коммите
    #39009176
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день .
Поведение такое - есть веб приложение на локальной машине - все работает нормально и транзакции отрабатывают как надо ...
на тестовом сервере- транзакции отрабатывают очень странно ... а именно нет вставки в расшивною таблицу

что есть :
Basket - и ShoppingCart - в которой могут лежать много баскетов - то что они могут лежать - задается через отдельную таблицу :


кейс такой

создаем новый баскет - т.к новой корзины нет , создаем новую корзину и связываем их
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Entity(name = "\"Basket\"")
public class Basket implements Serializable {

    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "\"transactionId\"")
    private long transactionId;



Код: 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.
@Entity(name = "ShoppingCart")
@org.hibernate.annotations.Table(
    appliesTo="ShoppingCart",
    indexes = { @Index(name = "IDX_SHOPPING_CART", columnNames = {"name" , "phone"} ) }
)

 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 = "transactionId"),
                uniqueConstraints= @UniqueConstraint(name = "IDX_CART_TICKET",columnNames={"shoppingCartId", "transactionId"})
                )
    private List<Basket> tickets = new ArrayList<Basket>(3);



Далее метод контроллера
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    @Autowired
    private BasketService basketService;

  @RequestMapping(value = "/add-new", method = RequestMethod.POST)
    public void addTicketToCart(@Valid BetForm betForm, final HttpServletRequest request, final HttpServletResponse response) throws IOException {
        
...

Basket basket = new Basket(betForm);

basketService.save(basket);

Long transactionId = basket.getTransactionId();
betForm.setBasketTransactionId(transactionId);

 if (ShoppingCartStatus.NEW.equals(shoppingCart.getCartStatus())) {
         shoppingCart.addTicket(basket);
  }

            basketService.save(shoppingCart);
} //end



сам сервис

Код: 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.
@Service
public class BasketServiceImpl implements BasketService{


@Autowired
	private SessionFactory sessionFactory;
	
	private HibernateTemplate ht;
	
	@PostConstruct
	public void init()
	{
		ht = new HibernateTemplate(sessionFactory);
                ht.setCheckWriteOperations(false);
	}

   @Override
    @Transactional
    public Basket save(Basket basket) {
        basket.setCreationDate(new Date());
        ht.save(basket);
        return basket;
        
    }   


    @Override
    @Transactional
    public ShoppingCart save(ShoppingCart cart) {
        if (cart.getCreationDate() != null) {
            cart.setCreationDate(new Date());
        }
        ht.saveOrUpdate(cart);
        return cart;
    }



лог на локальной машине :

происходит сразу : в методе контроллера ...

Hibernate: insert into `Basket` (creationDate, `вуввв`) values (?, ?)

после выхода из контроллера :


Hibernate: insert ShoppingCart ...
Hibernate: insert into ShoppingCartTicket (shoppingCartId, transactionId) values (?, ?)

т.е все нормально отработало ...


теперь весь тот же код на удаленной тестовой машине :

так же происходит вставка в
Hibernate: insert into `Basket` (creationDate, `вуввв`) values (?, ?)

по выходу из контролла -

Hibernate: insert ShoppingCart ...

а !!!!!

Hibernate: insert into ShoppingCartTicket (shoppingCartId, transactionId) values (?, ?)

связки не происходит !!!!

вопрос почему???
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39009228
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Atum1, может, из-за вот этого фрагмента:

Код: java
1.
2.
3.
if (ShoppingCartStatus.NEW.equals(shoppingCart.getCartStatus())) {
         shoppingCart.addTicket(basket);
  }



Дебажили на удаленной тестовой машине?
Как-то мне кажется, что базы данных разные.
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39009238
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yelenaAtum1, может, из-за вот этого фрагмента:

Код: java
1.
2.
3.
if (ShoppingCartStatus.NEW.equals(shoppingCart.getCartStatus())) {
         shoppingCart.addTicket(basket);
  }



Дебажили на удаленной тестовой машине?
Как-то мне кажется, что базы данных разные.

база одна ..

shoppingCart.addTicket(basket); - отрабатывает - и физически в коллекции появляется ...но при сохранении нет каскадной вставки

только по выходу из метода происходит вставка в shoppingCart


такое впечатление : что

HibernateTemplate как то странно работает с транзакциями


там где метод save - все отлично отрабатывает ... а там где saveorupdate - Нет!

как такое может быть?

saveorupdate is not valid without active transaction ? но транзакции стоят везде и методы независимые ... почему они объединятся... в какую одну транзакцию или нет??? непонятно ...
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39009242
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Atum1, а почему получается, что

авторпосле выхода из контроллера :

Hibernate: insert ShoppingCart ...
Hibernate: insert into ShoppingCartTicket (shoppingCartId, transactionId) values (?, ?)


?

Может, сессия уже закрылась. Если у вас OpenSessionInView.
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39009247
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Atum1 saveorupdate is not valid without active transaction ? но транзакции стоят везде и методы независимые ... почему они объединятся... в какую одну транзакцию или нет??? непонятно ...

А где вы начинаете эту новую транзакцию, чтобы независимые с propagation=Propagation.REQUIRED - по умолчанию, объединились в одну?

Раз нет такой транзакции, то каждый раз получается новая.
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39009249
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yelenaAtum1 saveorupdate is not valid without active transaction ? но транзакции стоят везде и методы независимые ... почему они объединятся... в какую одну транзакцию или нет??? непонятно ...

А где вы начинаете эту новую транзакцию, чтобы независимые с propagation=Propagation.REQUIRED - по умолчанию, объединились в одну?

Раз нет такой транзакции, то каждый раз получается новая.

да вот именно , тогда почему по вызову basketService.save(shoppingCart);

выполняется только

Код: java
1.
Hibernate: insert ShoppingCart ...



а не

Код: java
1.
2.
Hibernate: insert ShoppingCart ...
Hibernate: insert into ShoppingCartTicket (shoppingCartId, transactionId) values (?, ?)
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39009253
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yelenaAtum1, может, из-за вот этого фрагмента:

Код: java
1.
2.
3.
if (ShoppingCartStatus.NEW.equals(shoppingCart.getCartStatus())) {
         shoppingCart.addTicket(basket);
}



Дебажили на удаленной тестовой машине?


Я уже говорила, что меня смущает эта проверка. Вы дебаггером проверяли, что выполняется shoppingCart.addTicket(basket); ?
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39009255
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы объясните: у вас все-таки ошибка в логе или просто вставки нет?
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39009337
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yelenaВы объясните: у вас все-таки ошибка в логе или просто вставки нет?

На локальной машине все ок вставка есть на удаленном сервере Элемент добавяется в карту но в таблицу вставки нет
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39009346
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Atum1yelenaВы объясните: у вас все-таки ошибка в логе или просто вставки нет?

На локальной машине все ок вставка есть на удаленном сервере Элемент добавяется в карту но в таблицу вставки нет

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

А то у вас уже в комментариях мелькало "saveorupdate is not valid without active transaction", а потом вы говорите, что ошибок не было и нет.
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39009508
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yelenaAtum1пропущено...


На локальной машине все ок вставка есть на удаленном сервере Элемент добавяется в карту но в таблицу вставки нет

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

А то у вас уже в комментариях мелькало "saveorupdate is not valid without active transaction", а потом вы говорите, что ошибок не было и нет.

как раз я его и дебажу ... ошибок нет , локально вставки в расшивочную таблицу идет , на удаленном сервере - нет вот и вся разница ...
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39009520
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Включи логирование на debug и посмотри объекты. Хибер все сущности расписывает. Может не попало ничего в ShoppingCart.tickets
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39009987
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1,

Включи логирование на debug и посмотри объекты. Хибер все сущности расписывает. Может не попало ничего в ShoppingCart.tickets


попало - сайз 1 , объект есть в коллекции ...
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39010050
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Atum1, а basket на момент сохранения shoppingCart уже в базе данных виден? Если breakpoint поставить перед сохранением shoppingCart.
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39010060
Pavel Kurakin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1локально вставки в расшивочную таблицу идет , на удаленном сервере - нет вот и вся разница ...
На сколько я понял эти две вставки связаны межу собой, а у Вас это в разных транзакциях делается.
На локальной машине все хорошо, а на удаленной вторая транзакция почему то откатывается. Может нарушаются какие то ограничения в удаленной БД, может оптимизатор на удаленной машине местами вызов методов переставил :)
Если вставка должна происходить либо в обе таблицы, либо не должна происходит вообще, делайте это все в одном методе.
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39010088
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel Kurakin,
возможно.
Я предлагаю аффтару всё таки, выяснить.
- вставляется и откатывается или НЕ вставляется.
Либо по логу, либо сразу прочитав таблу в этой же транзакции-сессии.
А потом уже искать причину.
Да и ID транзакции же тоже можно в логи добавить?
Если бизнес транзакция одна, то и физическая должна одна. Иначе не откатить.
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39011319
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel KurakinAtum1локально вставки в расшивочную таблицу идет , на удаленном сервере - нет вот и вся разница ...
На сколько я понял эти две вставки связаны межу собой, а у Вас это в разных транзакциях делается.
На локальной машине все хорошо, а на удаленной вторая транзакция почему то откатывается. Может нарушаются какие то ограничения в удаленной БД, может оптимизатор на удаленной машине местами вызов методов переставил :)
Если вставка должна происходить либо в обе таблицы, либо не должна происходит вообще, делайте это все в одном методе.

в том то и дело что нет явной связи - вставка в первую таблицу - обязательна и она происходит ...

вторая таблица это абстракция -как и расшивочная таблица ... первая таблица ничего о других не знает .

ps

добавил в код ht.flush();
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    @Override
    @Transactional
    public ShoppingCart save(ShoppingCart cart) {
        cart.setCreationDate(new Date());
        ht.saveOrUpdate(cart);
        ht.flush();
        return cart;
    }



все стало работать одинаков и верно .
...
Рейтинг: 0 / 0
HibernateTemplate странное поведение при коммите
    #39011411
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1вторая таблица это абстракция -как и расшивочная таблица ... первая таблица ничего о других не знает .
обычно на момент написания кода - уже все всё знают.
Либо короткие транзакции, строго последовательны, сброс в БД на каждый чих, перечитка заново и т.д.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / HibernateTemplate странное поведение при коммите
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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