有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA ORM与OneTONE映射的混淆

我读过OneToOne映射是“Java中的关系是源对象具有引用另一个目标对象的属性,并且(如果)该目标对象与源对象具有反向关系,那么它也将是OneToOne关系。” 资料来源:http://en.wikibooks.org/wiki/Java_Persistence/OneToOne

基于以上,我假设一个表可以引用另一个基数等于(0)1的表,这个表可以反向引用第一个基数相同(0)1的表

所以,我创建了这个简单的实体(Cust可以有一个地址,而address可以有一个Cust)

@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();

当我试图用相同的地址保存两个CUST时,我期待着出现一些异常。然而,代码运行后,在数据库中我可以看到一个地址和两个客户:

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最终版本,DB是H2 1.4.181


共 (1) 个答案

  1. # 1 楼答案

    可能重复的http://stackoverflow.com/questions/8968294/why-onetoone-is-allowing-duplicate-associations看起来@OneToOne没有强制执行唯一约束