【问题标题】:JPA ORM - Confusion with OneToOne mappingJPA ORM - 与 OneToOne 映射混淆
【发布时间】:2014-09-02 19:08:15
【问题描述】:

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

基于上述,我假设一个表可以引用另一个基数等于(零)一的表,并且这个表可以反向引用具有相同基数(零)一的第一个表。

所以,我创建了这个简单的实体(Cust 可以有一个 Adress,Adress 可以有一个 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();

在尝试使用同一个地址保存两个客户时,我预计会出现一些异常。但是,代码运行并且在数据库中我可以看到一个地址和两个客户:

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

【问题讨论】:

  • 我敢打赌,因为thisSameAddress 在您 .setAddress 时是一个独立的实体,我认为代码的行为正是它应该的行为,(ADRESS 中的单个条目表明 Cust c有地址,因为它在 b 之后被持久化...如果你想看到一个异常,然后在em.persist(b) 上提交事务,然后执行em.persist(c)
  • 仍然没有例外,两个客户都使用同一个地址。

标签: java hibernate jpa


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多