我已经读到OneToOne映射是“ Java中的关系是源对象具有引用另一个目标对象的属性,并且(如果)目标对象与源对象具有反向关系,那么它也将是OneToOne关系。”
来源:http://en.wikibooks.org/wiki/Java_Persistence/OneToOne
基于上述,我假设一个表可以引用基数等于(零)一个的另一个表,而这个表可以反向引用具有相同基数(零)的一个表。
因此,我创建了这个简单的实体(客户可以有一个地址,而客户可以有一个地址)
@Entity
public class Cust {
@Id
@GeneratedValue
private Long id;
private String desc;
@OneToOne(fetch = FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.REMOVE})
@JoinColumn(name="adress_fk")
private Adress adress;
//getters, setters...
@Entity
public class Adress {
@Id
@GeneratedValue
private Long id;
private String val1;
private String val2;
@OneToOne(mappedBy = "adress")
private Cust b;
//getters, setters...
我很好奇,当我尝试用同样的地址坚持住两个高手时,会发生什么。
我编写了示例代码进行尝试:
Adress thisSameAddress = new Adress();
thisSameAddress.setVal1("blabla");
thisSameAddress.setVal2("nlanla");
Cust b = new Cust();
b.setAdress(thisSameAddress );
b.setDesc("asdasd");
Cust c = new Cust();
c.setAdress(thisSameAddress );
c.setDesc("eeee");
tx.begin();
em.persist(b);
em.persist(c);
tx.commit();
当尝试使用此相同地址保留两个尖峰时,我期望有一些例外。但是,运行了代码,在数据库中,我可以看到一个地址和两个提示:
SELECT * FROM CUST;
ID DESC ADRESS_FK
1 asdasd 1
2 eeee 1
SELECT * FROM ADRESS;
ID VAL1 VAL2
1 a c
为什么JPA允许这种操作?这就像是“多(客户)对一个(地址)”关系。
JPA实施为4.3.6 Final,DB为H2 1.4.181
最佳答案
http://stackoverflow.com/questions/8968294/why-onetoone-is-allowing-duplicate-associations
的可能重复项@OneToOne
似乎没有实施唯一约束
关于java - JPA ORM-与OneToOne映射混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25630576/