2009-04-28 17 views
1

JPAまたはJPA + Hibernate拡張では、コンポジットプライマリキーの一部である外部キーを使用できますか?外部キーもプライマリキーの一部です

@TableGenerator(name = "trial", table = "third", 
     pkColumnName = "a" , valueColumnName = "b", pkColumnValue = "first")  
@Entity  
public class First{  
@Id 
@GeneratedValue(strategy = GenerationType.TABLE, generator = "trial") 
protected int a; 

@OneToMany(mappedBy ="first", cascade = CascadeType.PERSIST) 
@JoinColumn(name = "a") 
protected List<Second> seconds; 
} 

class IDC implements Serializable{ 
//@Column(name = "a", insertable = false, updatable = false) 
    protected int a; 
protected int b; 
} 

@Entity  
@IdClass(IDC.class) 
public class Second{  
    @Id 
    //@Column(name = "a", insertable = false, updatable = false) 
protected int a; 
@Id 
protected int b; 

    @ManyToOne 
@JoinColumn(name = "a"/*, insertable = false, updatable = false*/) 
First first; 
} 

メイン:

public class Persister { 
public static void main(String[] args) { 

First aFirst = new First(); 

Second aSecond = new Second(); 
aSecond.b = 300;  
List<Second> scnds = new ArrayList<Second>(); 
scnds.add(aSecond); 

aFirst.seconds = scnds; 
aSecond.first = aFirst; 


aEntityManager.getTransaction().begin(); 
aEntityManager.persist(aFirst); 
aEntityManager.getTransaction().commit(); 
}} 

問題は、 "第二" クラスである:

私はフィールド "A" で "偽=挿入可能偽=更新可能" に設定した場合、それが例外をスローします:「範囲外のパラメータインデックス4 1と3の有効な値の間ではありません。」

と私f @manyToOneの関係で "insertable = false、updatable = false"を設定すると、テーブル "Second"の "a"に0を設定します

目的:First.aの生成値をSecond .a。

/////////////////////////////

にDBを作成するSQL:

テーブルを作成します最初( int、 主キー(a) );

秒( INT、 BのINT、 主キー(A、B) )のテーブルを作成します。

テーブルを3番目に作成します( a varchar(20)、 b int )。すべての

ください...事前に

ありがとうを助ける

答えて

2

まず、あなたがする必要がありますが、確かではありますか? ...

とにかく。私はここに私の無知を示​​すかもしれないが、私はあなたが非常に近いかもしれないと思うが、物事の順序はそうではない。生成されたキーを読み込む

は次のように行うことができます。

... 
First first = new First(); 
entityManager.save(first); //<- the id is updated 

Second second = new Second(); 
second.setB(300);  
second.setA(first.getA()); 

first.setSeconds(new ArrayList()); 
first.getSeconds().add(second); 
entityManager.save(second); 

entityManager.getTransaction().commit(); 

は、あなたがこれを読んでいますか?

Java Persistence : Mapping A Joing Table With Additional Columns

そのないJPAが、あなたは幸運Hibernateは同じフィールドに設定@Idと@ManyToOneタグの両方を有するサポートすることが可能である場合。あなたはそれを試しましたか?それはいいとは思いません:-) ...

@Id // may not work 
@ManyToOne // may not work 
@JoinColumn(name = "a") 
First a; 

ああ、それは "a"という接頭語はどれくらいですか?引数?あいまいですか?相反する?奇抜なこと?

+0

あなたのために、@manytooneで@idを試しましたが、うまくいかないようです。 – Moro

関連する問題