2017-01-16 22 views
0

エンティティからの必要なフィールドのみをロードする制限を追加するにはどうすればよいですか? CustomerUser OneToOneマッピングを持ち、OneToOneマッピングとしてUserを持つTransactionテーブルを持つMy Userテーブル トランザクションをロードすると、ユーザーとそれぞれの顧客が読み込まれますが、パスワードとcustomeruserテーブルからその他のファイルをロードしたくありません。 (Hibernateのバージョン4.2.6)Hibernate-フィールド遅延読み込み

+0

jsonでトランザクションをロードしていますか? –

+0

はい、私はjsonデータを取得しています –

答えて

1

あなたは

@Basic(fetch = FetchType.LAZY) 

しかし、それはあなたのフィールド上で動作するためにあなたが休止状態バイトコードエンハンサー(some back story

 <plugin> 
      <groupId>org.hibernate.orm.tooling</groupId> 
      <artifactId>hibernate-enhance-maven-plugin</artifactId> 
      <version>${hibernate.version}</version> 
      <executions> 
       <execution> 
        <configuration> 
         <failOnError>true</failOnError> 
         <enableLazyInitialization>true</enableLazyInitialization> 
         <enableDirtyTracking>true</enableDirtyTracking> 
        </configuration> 
        <phase>compile</phase> 
        <goals> 
         <goal>enhance</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

別を有効にする必要があることを行うことができ2つのエンティティを同じテーブルにマップすることです。 CustomerUserのように、常にロードされるすべてのフィールドをマップすることができますが、CustomerPasswordはIDとパスワードだけを持ちます。次に、サービス/リポジトリからパスワードエンティティを必要とするときにのみ、パスワードエンティティをロードします。

これは、遅延プロパティチケットを修正する前の一般的な回避策でした。 3年のようになりました:P。

+0

今私のプロジェクトはとても広大になり、私のpojoデザインに触れることもできません。 CustomerUserは非常に多くの機能で使用されています。 –

+0

あなたの提案は涼しい –

+0

私が知る限り、Hibernateには他の方法はありません。 – hakamairi

1

あなたがする必要があるのは、Jsonアノテーションとフェッチタイプを記述することです。 は、例えば:

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) 
@JsonIgnore 
private CustomerUser customerUser; 

FetchType.LAZY自動的にクラスをロードしません。 @JsonIgnoreはクラスをjsonにブロックします。

あるいは、

パスワードを除くすべての変数をCustomerUserをロードしたいとしましょう。あなたがする必要があるのは、パスワード変数に@JsonIgnoreを追加することです。

public class User { 
     .... 
     @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE) 
     @JsonManagedReference 
     private CustomerUser customerUser; 
     .... 
} 

public class CustomerUser { 

     @Column(name = "username") 
     private String username; 

     @Column(name = "password") 
     @JsonIgnore 
     private String password; 
     ...... 
     ...getters/setters 
} 
+0

面白いので、質問をマッピングするのではなく、シリアル化質問に答えるようにテーブルを回しました。 – hakamairi

+0

彼はレイジーロードを使用したいし、トランザクションをjson形式でロードします。私はマッピングとシリアライズの両方を説明しました –

+0

もちろん、あなたは正しいです。質問のレイジーフィールドの部分を無視し、シリアライゼーションでそれを除外するだけで十分であると仮定すると、これは適切なアプローチになります。しかし、それを読み込まないようにする方法は問題ではありません。 – hakamairi

関連する問題