2010-11-30 20 views
0

私はHibernateは、エンティティ定義ちょっとこだわっている:休止状態:複数のFK関係

(A)

  • fromCompany
  • :私は、データベース内の次の2つの表を持っていると仮定すると

    toCompany

  • viaCompany

(B)

  • 企業ID(PK)
  • 説明

場所の要素(A)(B)の主キーを指します。 FKとPKの間には3対1の関係があります。 別のmappedBy条件を持つ3つのOneToOneステートメントが行かないと思いますか?長い日だった - 私はおそらくちょうどそれを得ることはありません;)

あなたの助けてくれてありがとう!

+1

はこの間違いOneToOneとManyToOneされていません。

はこれを参照してください?テーブルAが出荷テーブルを言う場合、テーブルBの会社は1つのアイテムのみを出荷できますか? – Qwerky

答えて

0

私が正しく理解している場合は、データベースは次のようになりたい:もしそうなら

tableA 
- id 
- fromCompanyId (references tableB.id) 
- toCompanyId (references tableB.id) 
- viaCompanyId (references tableB.id) 

tableB 
- id 
- description 

、あなたは確かにこれを持つことができます。リレーションシップのデフォルトの列名をオーバーライドするだけで、各アソシエーションがデフォルトの名前に戻されるのではなく、独自の列名になり、3つのアソシエーションが同じ名前でレンダリングされ、問題が発生します。

私はOneToOneと実際には同意しませんが、これは意識的な決定だったと思います。 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-mapping-association

+0

あまりにも多くの人に感謝します - 後で数時間の睡眠を取った後、私は思考する能力を取り戻しました;)そしてあなたを傷つけて少し残念です。 – henning

+0

テーブルの構造は確かにあなたが思ったとおりです。 はい、1対1の関係の考え方は、アプリケーションのシナリオに基づいています。チャンスはあるものの、例えば同じIDが使用されます。 fromCompanyとviaCompanyの2つの意味的に異なるオブジェクトと見なす傾向があります。なぜなら、会社自体が各データフィールドで異なる役割を果たしているからです。しかし、あなたは確かに正しいです、一般的には、1対多の関係が良い方法かもしれません。 – henning

0

あなたは確かに1対1の関係でこれを行うことができます。 Aクラスには3つのCompanyオブジェクトがあり、適切なマッピングがあります。

コードとハイバネートのマッピングがわかると助けになります。

0

すべてのエンティティは、IDを必要とするため、を動作しないでしょうClassBの

@Entity 
class ClassA { 

    //@ID 
    //private id; 

    @ManyToOne 
    private ClassB from; 

    @ManyToOne 
    private ClassB toCompany; 

    @ManyToOne 
    private ClassB viaCompany; 
} 

を指して3つのManyToOne関係を持つクラスAを実装する最も簡単な方法。 - (3つのアソシエーションからなる)結合IDを使用してこの問題を克服しようとすることもできますが、他のエンティティとのアソシエーションからなるIDを実装するのは非常に面倒です。

@see Hibernate/persistence without @Id

にHibernateが提供する他の方法は、その三元アソシエーションと呼ばれています。 - この場合、3つのm:n関係の形で完全なテーブルAをモデル化します。 - しかし、これも非常に複雑な作業です。

@see http://docs.jboss.org/hibernate/core/3.5/reference/en/html/collections.html#collections-ternary