2016-02-01 4 views
2

Я прошел через удаленные и прикрепленного объекта согласно моему пониманиюMerge терпит неудачу когда-то в JPA Hibernate, но в той же самой транзакции PERSIST работы

User user=entityManager.find(User.class,1); 

здесь пользователь является приложенный лицом каких-либо изменений в этой воли быть отражены в базе данных

И отдельно стоящий объект Недавно созданный объект, который можно использовать вместо слияния упорствовать в следующим образом @

User userDetached=new User; 
user.setID(1); 
User userattahed=entityManger.merge(userDetached); 
userattahed.setName("cool"); 

Здесь имя будет отражено в базе данных ... если я не ошибаюсь

Ниже мой код, где несколько раз (100/10) слияние не работает, где, как сохраняются 100% работ ...

  entityManager = JPAUtil.getEntityManager(); 
      UsersModel user=entityManager.find(UsersModel.class,getMobile_num()); 
      TrackModel track=new TracksModel(); 
      user.setBalance(user.getBalance().add(getAmount())); 
      track.setMobile_Num(getMobile_num()); 
      track.setTransaction_Type(getTransaction_Type()); 
      track.setAmount(getAmount()); 
      entityManager.merge(user);//doesn't update few times 
      entityManager.persist(track); //works 100% 
      JPAUtil.commit(); 
+1

Почему вы объединяете сущность, находящуюся в «управляемом» состоянии? бессмысленно, поскольку обновления будут «известны». –

+0

@NeilStockton Я понимаю, что вы имели в виду, но это ничего не значит? –

+0

Это означает, что ваш вызов бессмыслен (так же бессмысленно, как и сравнение с сохраняемым объектом DIFFERENT). И если вы хотите, чтобы DEBUG ваша проблема, вы смотрите на журнал, какой бы ни был выбран ваш JPA-провайдер. –

ответ

0

Эта линия немного странно:

user.setBalance(user.getBalance().add(getAmount())); 

Это единственное изменение, которое вы фактически делаете на пользователя. Что оно делает? Каков баланс, что добавить к нему? В некоторых случаях, вероятно, нет никаких изменений, поэтому хранить ничего не нужно.

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

Также обратите внимание, что изменения не обязательно очищаются от базы данных, когда вы вызываете сохранение слияния или что-то в этом роде. Он может зафрахнуться на фиксацию. Поэтому всегда выполняйте транзакцию до конца, прежде чем вы решите, что было покрашено.

+0

спасибо за ответ ... Атрибут баланса - это тип данных BigDecimal .... где мне нужно добавить Amount (getAmount) к текущему балансу пользователя, поэтому я делаю это, как этот user.setBalance (user.getBalance(). Add (getAmount())); –

+0

Возможно, все равно, что сумма равна нулю? Как вы определяете, «работает ли это» или нет? –

+0

вы видите track.setAmount (getAmount()); линии, которые получают PERSIST в БД ... говорят, что последней транзакцией AMOUNT был этот track.getAmount –

0

У меня была аналогичная проблема, в которой последующее сохранение и слияние терпят неудачу; вот пример кода, который был взломан:

public MyType persistMyType(MyType myType) { 
     MyType merge = em.merge(myType); 
     em.persist(merge); 
     return merge; 
} 

Как только я удалил слияние, у меня не было этой проблемы.

PS: MyType был потомком MyParent, где он был аннотированный как это:

@OneToMany(mappedBy="myParent", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER) 

Я рад, что я нашел работу вокруг, я до сих пор не знаю, что пошло не так. Я склонен полагать, что проблема связана с грязными объектами. SQL logging показывает множество SELECT, которые происходят до их сохранения, что может дать вам представление о том, что делает hibernate.

 Смежные вопросы

  • Нет связанных вопросов^_^