与JPA @MapsId注释共享主键

时间:2013-11-19 11:38:53

标签: hibernate jpa

要获得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标识符。所以约束不受尊重。但我不明白代码有什么问题?

有人可以指出我的错误吗?

1 个答案:

答案 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