2016-05-10 5 views
2

Мы используем сущности JPA и спящий режим для сохранения. У меня есть объект Plan и объект Escalation. Когда я создаю новую эскалацию и сохраняю ее, план также как-то обновляется. Это обновление вызывает OptimisticLockException и предотвращает дальнейшую эскалацию. Вот код скелет -Родительская сущность, которая излишне обновляется при сохранении нового дочернего объекта

@Entity 
@Table(name = "T_ESCLT") 
public class Escalation extends PersistentEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ESCLT_ID") 
    private Integer id; 

    @ReflectionCopy.Exclude 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "CUST_RNEW_TASK_ID", nullable = false) 
    private CustomerRenewalTask renewalTask; 

    @ReflectionCopy.Exclude 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "PLN_DSG_ID") 
    private Plan plan; 

public Escalation(CustomerRenewalTask task, Plan plan, String description) { 
     Preconditions.checkNotNull(task); 
     Preconditions.checkNotNull(description); 

     this.renewalTask = task; 
     this.plan = plan; 
     this.description = description; 
     this.creationTimestamp = DateUtils.currentTimestamp(); 
    } 

Plan и CustomerRenewalTask не имеют эскалация отображаются в них. Когда я запускаю этот

@Transactional 
    public Result persist() { 
     CustomerRenewalTask customerRenewalTask = customerRenewalTaskDao.findById(2); 
     Plan plan = planDao.findById(16); 
     planDao.detach(plan); 
     Escalation escalation = new Escalation(customerRenewalTask, plan, "My Escalation"); 
     escalationDao.persist(escalation); 
     return ok(); 
    } 

Я вижу это в журнале консоли

DEBUG - insert into T_ESCLT (ESCLT_ID, OPTMSTC_LOCK_ID, ATRB_NM, CMNT_TXT, CRT_TS, ESCLT_DSCR, APP_LNK_TXT, PLN_DSG_ID, RT_BLCK_IND, CUST_RNEW_TASK_ID, RSLV_DT, RSLV_BY_USR_ID, RSLV_BY_USR_NM, ESCLT_STTS_CD, ESCLT_TYP_CD) values (default, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
DEBUG - update T_PLN_DSG set OPTMSTC_LOCK_ID=?, ASSOC_PLN_DSG_ID=?, BRTH_DT_RT_IND=?, PLN_EFF_DT=?, ELGBL_MBR_CNT=?, RNEW_PLN_DTL_XML=?, SUM_MBR_PRTCP_LIF_CNT=?, VLD_STTS_CD=?, PLN_NM=?, PLN_GRP_ID=?, PRNT_PLN_DSG_ID=?, PRTCP_MBR_CNT=?, PRTCP_PCT=?, PRTNR_PLN_DSG_ID=?, RT_CALC_XML=?, UW_VRFY_IND=?, SUM_VOL_AMT=? where PLN_DSG_ID=? and OPTMSTC_LOCK_ID=? 

Я не хочу, чтобы обновленная информация о плане будет опубликован как ничто на Plan переоделся. Я просто использовал план создания эскалации.

+1

вы могли бы делать что-то в planDao.detach (план), который обновляет ATTRS на план объекта? – Franck

+0

Пожалуйста, разместите сопоставления для объекта «Plan» и реализации соответствующих методов в «PlanDao». –

+0

по определению, вы должны что-то делать, чтобы «планировать», что заставляет Hibernate думать, что он «грязный» и нуждается в обновлении после 'flush()' –

ответ

0

Один из способов остановить это обновление - указать update = false для индивидуальных свойств объекта плана, но при этом вы предотвращаете, что обновления вообще происходят в таблице Plan.

Пожалуйста, проверьте, если указать каскад = CascadeType.PERSIST решает ваш вопрос

@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.PERSIST) 
+0

Я пробовал это в Эскалации - @JoinColumn (name = "PLN_DSG_ID") @ManyToOne (fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) частный план плана; но я продолжаю видеть как вставки эскизации, так и в плане обновления SQL в журнале консоли. – Vinay