我正在使用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
答案 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。