2017-04-27 9 views
1

エンティティ用の複合主キー(3列からなる)があります。Springデータの保存中にselect文を避ける方法JPA

複合キーの2つの列のうち、1は自動インクリメントで、もう1つは別のエンティティから取り込まれます。

エンティティを保存すると、select文を実行してからstatementを挿入します。 私はエンティティが一意であり、単にテーブルに挿入したいと知っているので、select文の実行を無視/回避したいと思います。

フィールドに@Version(@Version Long versionなど)をエンティティで使用していることについて読んでいますが、その場合はテーブルにもカラムを置く必要があります。

特に私が挿入しているレコードが一意であることを知っているときに、多くの時間を費やすselect文の実行。

[EDITED]

私のエンティティクラスは次のとおりです。

@Entity 
public class Table implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private TablePK id; 

    private String Name; 

    private String country; 
} 

@Embeddable 
public class TablePK implements Serializable { 
    //default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    private Integer age; 
} 

とログは次のとおりです。

10:39:57.650 [main] DEBUG org.hibernate.SQL - select 
10:39:57.684 [main] DEBUG org.hibernate.loader.Loader - Done entity load 
10:39:57.693 [main] DEBUG o.h.e.i.AbstractSaveEventListener - Generated identifier: 
10:39:57.705 [main] DEBUG o.h.e.t.internal.TransactionImpl - committing 
10:39:57.706 [main] DEBUG o.h.e.i.AbstractFlushingEventListener - Processing flush-time cascades 
10:39:57.707 [main] DEBUG o.h.e.i.AbstractFlushingEventListener - Dirty checking collections 
10:39:57.709 [main] DEBUG o.h.e.i.AbstractFlushingEventListener - Flushed: 1 insertions, 0 updates, 0 deletions to 1 objects 
10:39:57.709 [main] DEBUG o.h.e.i.AbstractFlushingEventListener - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections 
10:39:57.710 [main] DEBUG o.h.internal.util.EntityPrinter - Listing entities: 
10:39:57.726 [main] DEBUG org.hibernate.SQL - insert into Table 

誰が提案してくださいことができます。

+0

@NeilStocktonポスト編集 – Manglesh

+0

@NeilStocktonログから見ると、選択文があります。私はテーブルの構造を隠すために削除しました。だからそれはテーブルから選択するように言う.... – Manglesh

+0

@ NeilStocktonこんにちは私は私の選択し、テーブルの構造を隠すためにログを挿入するフィールドを隠していると言った... – Manglesh

答えて

1

エンティティマッピングの設計が間違っています。自動インクリメントされた列を既に使用したい場合、複合識別子が必要なのはなぜですか?

したがって、@EmbededIdの使用a simple auto-incremented identifierを削除し、年齢を基本属性としてマップします。

しかし、同様に多くの疑問の設計上の決定は、があります。私は、その場合にはしかし、実体に@Version(@Versionロングバージョンなど) でフィールドを持っていることについて読ん

私が持っている必要があります テーブルの列も同様に私は望みません。

@Version

注釈の理由は、長期実行トランザクションまたは弱い分離レベルでprevent lost updatesです。なぜ私はあなたの現在の問題と関係があると思いますか?

コンポジットキーから3つの列のうち、1は自動インクリメントであり、他の2つは別のエンティティから取り込まれています。

あなたは3列と言っていますが、複合IDには2列しかありません。

Hibernate User Guidethis tutorialの両方を読んで、Hibernateの仕組みと使い方を理解することをお勧めします。

+0

あなたのコメントをありがとうございます。 Data Architectに複合キーについて確認します。 – Manglesh

+0

がembaddedIdを削除しましたが、現在はidが自動生成されています...もうステートメントを選択できません.... 感謝@Vlad .. – Manglesh

関連する問題