2016-06-30 10 views
0

後に更新DBを休止:なぜ私は2つの関連entitesを持って追い出し

@Entity 
@DynamicUpdate(true) 
public class DreamTaskInfo { 
    private DreamInfo dreamInfo; 
    @ManyToOne 
    @JoinColumn(name = "DREAM_INFO_ID", nullable = false) 
    public DreamInfo getDreamInfo() { 
     return dreamInfo; 
    } 
... 
} 

@Entity 
@DynamicUpdate(true) 
public class DreamInfo { 
    private Set<DreamTaskInfo> dreamTasks = new LinkedHashSet<>(); 
    @OneToMany(mappedBy = "dreamInfo",cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @OrderBy("remindTime") 
    public Set<DreamTaskInfo> getDreamTasks() { 
    return dreamTasks; 
    } 
    ... 
} 

私は読み取り専用の使用のためにDBからDreamTaskInfoデータを使用したいので、私はこれを行う:

DreamTaskInfo task = this.get(id);//query from db 
getSession().evict(task);//getSession().contains(task)==false 

しかし、私は見つけますHibernateはフラッシュ時に常にこのタスクに対してupdate sqlを実行します。 最後に、私はevictの代わりにgetSession()。clear()を使用しています。 セッションで何かを熱心に取得または関連付けすることはありますか? 実際に私は何も手動で変更せず、自動的に更新を休止するので、これはこのquestionとは関係ありません。

+0

永続オブジェクトの[Hibernate:evict()]に、変更を保存している可能性のある複製](http://stackoverflow.com/questions/6836326/hibernate-evict-a-persistent-object-while-storing-its-changes) ) –

+0

更新クエリをそのパラメータと共に転記できますか。アップデートがなぜ生成されたのかを見るためにはデバッグする価値があります。 –

+0

@Vlad Mihalcea、実際には、レコードのすべてのフィールドをDBからの値クエリで更新します。 – yuxh

答えて

0

evict()を呼び出す前にセッションをフラッシュする必要があります。その後、evict()の後に実行される更新クエリは表示されません。

ソリューション:

DreamTaskInfo task = this.get(id);//query from db 
getSession().flush();// to make sure atomicity of session is maintained 
getSession().evict(task);//getSession().contains(task)==false 

あなたは、データベースからオブジェクトをフェッチした後に休止状態に更新クエリを実行する理由がある、いくつかの変更が行われている可能性があります。

セッションは、作業単位のインターフェイスになるように設計されています。トランザクションのセマンティクスは、この機能がないと災害になることがあります。同じセッションに参加している他のエンティティをフラッシュせずに個々のエンティティをフラッシュする必要がある場合は、作業単位を再考する必要があります。

+0

私はこの方法を試したが、仕事はしていないことに言及することを忘れている。 – yuxh

+0

"データベースからオブジェクトを取得した後にいくつかの変更があった可能性があります"と私は同じ考えを持っていますが、junitを使ってこのメソッドをテストして何も変更しません。 – yuxh

+0

あなたが何かを変更していなくても。セッションでもflushを呼び出す必要があります。しかし、あなたの前のコメントによると、私はあなたがそれを試したと思います。私は再び確認して、あなたに戻ってきます。 –

関連する問題