2017-04-27 63 views
0

進出口使用Hibernate和我有兩個表以PK爲VARCHAR2Hibernate映射兩個表相同的PK值(NO FK COL)

Table A 
------- 
myId varchar2(40) **PK** 
name varchar2(40) 

Table B 
-------- 
myId varchar2(40) **PK** 
someItem varchar2(100) 

注有在兩個表的外鍵和兩個身份識別碼是PK和插入後應該有確切的值。

我試過OneToOne映射,但似乎不喜歡被映射到的Id

@Entity 
@Table(name = "TABLE_A") 
public class TableA { 

@Id 
@GeneratedValue(generator = "uuid") 
@GenericGenerator(name = "uuid", strategy="uuid2") 
@Column(name = "myId", length = 40, nullable = false) 
private String id; 

@Column(name = "name", length = 40, nullable = false) 
private String name; 

@OneToOne(cascade = CascadeType.ALL) 
@PrimaryKeyJoinColumn 
private TableB tableB; 

} 

第二臺

@Entity 
@Table(name = "TABLE_B") 
public class TableB { 

@Id 
@GeneratedValue(generator = "uuid") 
@GenericGenerator(name = "uuid", strategy="uuid2") 
@Column(name = "myId", length = 40, nullable = false) 
private String id; 

@Column(name = "someItem", length = 40, nullable = false) 
private String anItem; 

} 

這將產生一個錯誤,指出我需要定義一個ID對於插入前的類TableB。但是我想讓Id成爲tableA的同一個id。有沒有辦法做到這一點在休眠?

Expected result: 
Table_A 
myId name 
================= 
JK89S Foobar 

Table_B 
myId someItem 
================= 
JK89S Razbaz 

回答

0

在我看來,這沒有任何意義。每個表必須有它自己的主鍵來準確地標識它的行。例如,如果您在postgresql數據庫中創建表,它幾乎總是會自動創建一個唯一於創建表的序列。

如果你想要一個id在兩個表中相同,那麼讓兩個表都有它自己的主鍵並添加一個可以在兩個表中相同的第二個id會更好。

public class TableA { 

@Id 
@Column(name="id") 
@GeneratedValue(strategy = GenerationType.Identity) 
private long id; 

@Column(name="tablewide_id") 
private long tableWideId; 

@Column(name="item") 
private String item; 

... 
} 

這分別適用於表B.

如果您不想手動創建「tableWideId」,則可以在數據庫中創建另一個表,並在應用程序中創建另一個表。

public class TableWideId { 

@Id 
@Column(name="id") 
@GeneratedValue(strategy = GenerationType.Identity) 
private long id; 

... //Getter & Setter 
} 

現在,你可以通過一個DAO

TableWideId id = new TableWideId(); 
long tableWideId = this.myDao.createTableWideId(id); 

TableA tableA = new TableA(tableWideId); // you need a proper Constructor 
TableB tableB = new TableB(tableWideId); 

// fill in the other properties 

this.myDao.createTableA(tableA); 
this.myDao.createTableB(tableB); 

做現在你有它自己的主鍵兩個表都共享同一個tableWideId。

+0

如果我能夠改變表格,我會這樣做。我明白這是沒有道理的,但這是我必須合作的。即使一個long被存儲爲一個字符串,我甚至不能將String列中的id列更改爲long。 –