2016-05-10 9 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(); 
    } 

PlanCustomerRenewalTaskはそれらにマッピングされたエスカレーションを持っていません。 私はこの

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

を実行すると、私は計画上の更新がPlan変わってしまった上で何として発行したくないコンソールログ

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

でこれを参照してください。私はエスカレーションを作成する計画を使用しました。

+1

が解決するかどうか

確認してくださいあなたはプランエンティティにattrsにを更新planDao.detach(案)の中で何かをやっているのでしょうか? – Franck

+0

'Plan'エンティティのマッピングと' PlanDao'に関連メソッドの実装を投稿してください。 –

+0

定義では、Hibernateに "汚れている"と思って、 'flush()'で更新する必要がある 'Plan'に何かをしている必要があります。 –

答えて

0

Plan Entityの個々のプロパティに対して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) プライベートプランプラン。私はコンソールログにeescalation insertとplan update SQLの両方を表示し続けています。 – Vinay

関連する問題