2009-11-30 14 views
10

私は特定のカテゴリ、すなわち古典的な多対1の関係に属する製品オブジェクトを持っています。選択せずに休止、挿入または更新

@Entity 
public class Product{ 

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

    String name; 
    Double price; 
    @ManyToOne(fetch = FetchType.LAZY) 
    Category category; 
... 
} 

@Entity 
public class Category implements Identifiable { 

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

    private String name; 
... 
} 

カテゴリを事前に選択せずに商品を挿入して更新したいと考えています。このように:

Product product = dao.get(productId); 
Category category = dao.get(categoryId); 
product.setCategory(category); 
dao.update(product); 

または

Product product = new Product(somename); 
Category category = dao.get(categoryId); 
product.setCategory(category); 
dao.insert(product); 

それが更新およびカテゴリ選択せずに挿入することは可能ですか?私はそのためにHQLやダイレクトクエリーを使用したくありません。

答えて

10

session.load()がこのような場合に特に存在します。以下は:

はデータベースにヒットしません。ただし、指定されたidで利用可能なカテゴリがない場合は、後の段階で(フラッシュ中、多かれ少なかれ)例外がスローされます。 load()を使用して

merge()よりも高速で、何の副作用を持っていません(カスケーディング、など...)私は、次の試してみた

2

Hibernateはオブジェクトの状態を判断する安全な方法が必要です。そのため、さまざまなセッションのオブジェクトを混在させることができないようにするためには長い道のりがあります(起動時にカテゴリをロードしてから後で使用することはできません)。あなたが設定している場合

Product product = new Product(somename); 
product.setCategory(session.merge(category)); 

任意のDBラウンドトリップが発生することはありません:

ソリューションは、このクラスのehcacheのように設定し、キャッシュ・プロバイダーを起動時にカテゴリをロードしてから、このコードを使用することですカテゴリインスタンスは変更できません。

0

Category category = new Category(categoryId); 
product.setCategory(category); 

をそして、それは働いていた、私は、製品レコードを意味しますDB内でidとカテゴリとカテゴリに正しくリンクしました

categoryId 

変更されていません。

+1

このアプローチの問題は、同じ識別子を持つ永続エンティティの新しいインスタンスを作成することです。これは、問題の「カテゴリ」が**現在**セッションに関連していなかったため、今度はあなたのために働いたかもしれません。そうであれば、Hibernateは例外をスローします。データの完全性の点でも危険です。 'category'に多対1のカスケードを指定した場合、上記のコードは元のカテゴリをすべての空白の値で上書きします(または制約違反エラーで失敗します)。 – ChssPly76

+0

Hm、私はやっているという感覚を持っていましたここでは厄介なもの。明確化のためにありがとう。 – Vladimir

関連する問題