gpt4 book ai didi

java - JPA ORM - 与 OneToOne 映射的混淆

转载 作者:行者123 更新时间:2023-12-01 12:35:34 24 4
gpt4 key购买 nike

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

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

因此,我创建了这个简单的实体(Cust 可以有一个地址,而 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

最佳答案

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

关于java - JPA ORM - 与 OneToOne 映射的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25630576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com