2009-04-28 134 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(); 
}} 

的問題是在課堂上 「二」:

如果我設置 「插入=假,可更新=假」 在現場 「一」,它拋出異常:

「參數索引超出範圍4不是與1有效值3之間」

而我f在@manyToOne的關係中設置「insertable = false,updatable = false」,它運行但在表「Second」的「a」中設置爲0

目標:將First.a的生成值設置爲Second 。一個。

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

的SQL創建DB:

創建表第一個( 一個int, 主鍵(a) );

創建表第二( 一個INT, b INT, 主鍵(A,B) );

create table third( a varchar(20), b int );

請...幫助

Thanx提前

回答

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但如果你是幸運的休眠可以支持同時具有@Id和@ManyToOne標籤設置在同一領域。你嘗試過嗎?這將是不錯的:-) ...

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

哦,什麼是「a」前綴所有關於?論據?含糊不清?矛盾的?安Enterprisy - 事物?

+0

Thanx給你,我試了@id @manytoone,但它似乎不工作。 – Moro 2009-04-28 19:07:02