5

JPA/Hibernate は初めてです。次の 2 つのテーブルがあるとします。

  • Employee (Id, Name, DeptId, ..) // DeptId は外部キーです。
  • Department (Id, DeptName, ..) // 部門は個別に永続化されます

以下のようなエンティティ:

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    private String name;
    private long salary;

    @OneToOne(cascade = {CascadeType.PERSIST})
    @JoinColumn(name="DEPT_ID") 
    private Dept dept;
    ...
    }

@Entity
public class Dept {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    private String name;
    ...
    **other huge collections with eager fetch ***
    }

私のアプリケーション DAO では、従業員エンティティにアクセスするときはいつでも、従業員エンティティの一部として部門名だけが必要であり、部門テーブルからは何も必要ありません。

  1. 部門を取得する方法。従業員エンティティの部門行全体ではなく、名前列のみ (部門によって作成された巨大なコレクションの熱心なフェッチを避ける必要があります)? もしそうなら、どの注釈を使用すればよいですか?
  2. このシナリオでカスケードを処理するには?
4

2 に答える 2

9

最良のオプションは、コレクションを遅延ロードしてから、コレクションが必要なクエリを熱心なロードに変更することです (結合フェッチを使用)。それをしない十分な理由がある場合は、次の回避策を試すことができます。

射影クエリを使用できます。これにより、結果ごとに [employee,name] 配列が作成されます。

select employee, employee.dept.name from Employee employee

@Formula を使用して、Employee テーブルの属性を Department テーブルの列にマップできます (このソリューションは Hibernate 固有であることに注意してください)。

class Employee {

   @Formula("(select deptName from Department where Department.id = DEPT_ID)"
   String deptName;

} 

もう 1 つのオプションは、コレクションを持たない新しいクラス DeptLite を作成することです。readonly - としてマップします@org.hibernate.annotations.Entity(mutable=false)

@Entity
public class Employee {

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    private String name;
    private long salary;

    @OneToOne(cascade = {CascadeType.PERSIST})
    @JoinColumn(name="DEPT_ID") 
    private Dept dept;

    @OneToOne(updatable=false,insertable=false)
    @JoinColumn(name="DEPT_ID") 
    private DeptLite deptLite;

    ...
}

@Entity
@org.hibernate.annotations.Entity(mutable=false)
class DeptLite  {

}
于 2012-09-07T06:07:49.097 に答える
0

エンティティにロードされるプロパティを制限することが必要な場合は、次の2つの方法があると思います。

  1. レイジープロパティフェッチを使用し、エンティティが取得されるたびにロードしたくないプロパティにモデルで注釈を付けます。

  2. Hibernate Projectionsを使用して、各クエリで必要なプロパティを制限し、各プロパティにPropertyProjectionを追加します。このようなもの:

    Projections.projectionList().add(Projections.property("prop1")).add(Projections.property("prop2")).. 
    

この助けを願っています。

于 2012-09-07T06:44:40.767 に答える