2010-11-21 4 views
0

I以下の状況を有する:すなわちHibernate 3で派生IDをどのようにマップするのですか?

@Entity 
class A{ 
    @Id 
    @SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID") 
    private Long aId; 
    @OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL) 
    private B b; 
    ... 
} 
@Entity 
class B{ 
    @Id 
    private A a; 
    ... 
} 

:そこAとB、Bとの間のOneToOne会合が弱いエンティティがされ、そのIDがクラスAから誘導され、私は「

既に@OneToOneの下に@PrimaryKeyJoinColumnを追加することでいくつかの解決策を試しましたが、これはarticleに言及しています。 "org.hibernate.id.IdentifierGenerationException:このクラスのIDはsave()を呼び出す前に手動で割り当てる必要があります:B"
このケースでは関連するかどうかわかりませんが、私は使用していますOracle 11g。

が更新

私は正しい方法でだと思います。

@Entity 
class A{ 
    @Id 
    @SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID") 
    private Long aId; 
    @OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL) 
    @PrimaryKeyJoinColumn(name="aId") 
    private B b; 
    ... 
} 
@Entity 
class B{ 
    @Id 
    @OneToOne 
    @JoinColumn(name="aId) 
    private A a; 
    ... 
} 

エラーは今異なるビットである:ここに私の問題の実際の状態であることがテーブルBに(代わりに、AIDの)列Aを検索しようとしている

java.sql.SQLException: ORA-00904: "B"."A": invalid identifier 

はI列名がBAではなくB.AIDであることを指定する方法を知らない

+0

あなたは休止3.5を使用する場合、これが役立つことがあります。http://stackoverflow.com/questions/ 4027623/how-do-i-cascade-save-a-one-to-one-bidirectional-relationship-on-primar – axtavt

答えて

1

私はこのlink

次正しい答えは次のようになり、私の問題を解決:

@Entity 
public class A { 

    @Id 
    @GeneratedValue 
    @Column(name = "aId") 
    private Long id; 

    @OneToOne(fetch = FetchType.LAZY, optional=false, cascade = CascadeType.ALL, mappedBy = "a") 
    private B b; 
    ... 
} 


@Entity 
@org.hibernate.annotations.GenericGenerator(name="a-primarykey", strategy="foreign", parameters={@org.hibernate.annotations.Parameter(name="property", value="a")}) 
public class B { 

    @Id 
    @GeneratedValue(generator = "a-primarykey") 
    @Column(name = "aId") 
    private Long id; 

    @OneToOne 
    @PrimaryKeyJoinColumn 
    private A a; 
    ... 
} 
1

エンティティBでこれを試しましたか?

@Entity class B { 
    @Id @OneToOne 
    @JoinColumn(name = "table_a_id") //put the correct column name for A's pk here 
    private A a; 
    .... 
} 
+0

はい。答えをありがとう、それは動作しません、同じエラー。記事によれば、派生したアイデンティティでカスケードを使用することはできないようです... – Neuquino

関連する問題