Hibernate映射具有相同PK值的两个表(NO FK col)

时间:2017-04-27 11:50:44

标签: hibernate

我正在使用hibernate,我有两个PK表作为varchar2

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

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

请注意,两个表中都没有外键,两个myId都是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;

}

这会产生一个错误,指出我需要在插入之前为类TableB定义一个id。但我希望Id与tableA的id相同。有没有办法在休眠中执行此操作?

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

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

1 个答案:

答案 0 :(得分:0)

在我看来,这没有任何意义。每个表必须拥有它自己的主键才能准确识别它的行。例如,如果在postgresql-database中创建一个表,它几乎总是会自动创建一个对创建的表唯一的序列。

如果你想在两个表中使用相同的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。