2016-05-10 12 views
2

beibehalten wird Ich JPA-Entitäten verwenden und für die Persistenz winter. Ich habe eine Plan Einheit und eine Escalation Einheit. Wenn ich eine neue Eskalation erstelle und sie fortsetze, wird der Plan auch irgendwie aktualisiert. Dieses Update verursacht OptimisticLockException und verhindert, dass weitere Eskalationen persistent werden. Hier ist der Code Skelett -geordnete Entität unnötig immer aktualisiert, wenn eine neue Kind Entität

@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 und CustomerRenewalTask nicht Eskalation in ihnen zugeordnet haben. Als ich diesen laufe

@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(); 
    } 

Ich sehe dies in dem Konsolenprotokoll

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=? 

Ich will nicht das Update auf Plan nichts ausgegeben werde auf Plan geändert wurde. Ich habe gerade Plan verwendet, um eine Eskalation zu erstellen.

+1

löst man etwas in planDao.detach (Plan), dass Updates attrs über den Plan Unternehmen tun könnte? – Franck

+0

Bitte stellen Sie die Mappings für die Plan Entität und die Implementierungen der relevanten Methoden in PlanDao ein. –

+0

per Definition, müssen Sie etwas 'Plan', die Hibernate verursacht zu denken, es ist„dirty“tun und muss auf' bündig aktualisiert werden() ' –

Antwort

0

Eine Möglichkeit, diese Aktualisierungen zu verhindern, besteht darin, update = false für einzelne Eigenschaften von Plan Entity anzugeben. Dadurch verhindern Sie jedoch, dass Aktualisierungen in der Plan-Tabelle vollständig ausgeführt werden.

Bitte überprüfen Sie, ob Kaskade Angabe = CascadeType.PERSIST Ihr Problem

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

Ich versuchte dies in Eskalation - @JoinColumn (name = "PLN_DSG_ID") @ManyToOne (fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) private Plan planen; aber ich sehe weiterhin, dass beide eescalation Update-SQL in das Konsolenprotokoll einfügen und planen. – Vinay