0

かどうかに基づいて2つのエンティティ間にオプションのManyToOneアソシエーションを作成したいのですentity1.name equals entity2.nameOf1が、オブジェクトを追加、削除、フェッチすることでサービスレイヤーでこの関係を維持する必要はありません。エンティティを取得するときに、この関係を維持したいだけです2、 hibernateはleft join entity1 e1 on e1.name = e2.nameOf1、selectクエリにを追加するか、entity2.getEntity1()の呼び出しを待って、where e1.name == ?引数としてnameOf1を使用してentity1をクエリします。これまで@JoinFormulaアノテーションを使用して試しましたが、それに関するドキュメントはほとんどありません。アノテーション付きのHibernateバージョン3.5.6を使用しています。

@Entity
public class Entity1 {
   @Id
   @GeneratedValue
   private Long id;
   @Column(unique = true)
   private String name;

   ...getter&setters...
}
@Entity
public class Entity2 {
   @Id
   @GeneratedValue
   private Long id;

   private String someProp;
   private String nameOf1;

   @ManyToOne(optional = true)
   // How to join them? this doesn't work
   // @JoinColumnsOrFormulas({ @JoinColumnOrFormula(formula = 
   //      @JoinFormula(value = "nameOf1", referencedColumnName = "name")) })
   // neither does
   // @JoinColumnsOrFormulas({ @JoinColumnOrFormula(column =
   //      @JoinColumn(name = "nameOf1", referencedColumnName = "name", 
   //          insertable = false, updatable = false, nullable = true)) })
   //@Fetch(FetchMode.JOIN)
   private Entity1 entity1;

   ...getter and setters...
}
4

1 に答える 1

1

それを行うには、クエリを使用するだけでよいと思います。

select e1 from Entity1 e1 where e1.name = :name

本当にこの道を進みたい場合は、JoinColumn を使用した単純な ManyToOne で十分です。ただし、挿入不可かつ更新不可にする必要があります。

@ManyToOne(optional = true)
@JoinColumn(name = "nameOf1", referencedColumnName = "name", 
            insertable = false, updatable = false)
private Entity1 entity1;
于 2012-05-31T17:02:31.733 に答える