要获得1<> 1关系的共享主键,我正在尝试使用JPA @MapsId注释,但我没有成功。
这是我的sql表生成:
CREATE TABLE `myschema`.`table2` (
`id` INT NOT NULL AUTO_INCREMENT,
`coltable2` VARCHAR(45) NULL,
PRIMARY KEY (`id`));
CREATE TABLE `myschema`.`table1` (
`id` INT NOT NULL,
`coltable1` VARCHAR(45) NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk`
FOREIGN KEY (`id`)
REFERENCES `myschema`.`table2` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE);
以下是我的两个班级:
表1:
@Entity
@Table(name="table1")
public class Table1 {
@Id
private int id;
@OneToOne(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="id")
@MapsId(value="id")
private Table2 table2;
....
}
表2:
@Entity
@Table(name="table2")
public class Table2 {
@Id @GeneratedValue
private int id;
@OneToOne(cascade=CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "table2")
private Table1 table1;
...
}
所以当试图通过这样做来保存时:
Table1 table1 = new Table1();
table1.setColTable1("table1");
Table2 table2 = new Table2();
table2.setColTable2("table2");
table1.setTable2(table2);
table2.setTable1(table1);
dao.save(table1);
我收到以下错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败
似乎@MapsId没有将id2值从table2标识符传播到table1标识符。所以约束不受尊重。但我不明白代码有什么问题?
有人可以指出我的错误吗?
答案 0 :(得分:2)
我不确定@MapsId
是否是您想要的。
@PrimaryKeyJoinColumn
可能就是您所需要的:
它可以用在OneToOne映射中,其中主键是 引用实体用作引用的外键 实体。
http://docs.oracle.com/javaee/5/api/javax/persistence/PrimaryKeyJoinColumn.html
http://vard-lokkur.blogspot.co.uk/2011/05/onetoone-with-shared-primary-key.html