gpt4 book ai didi

java - 一对一和多对一实体关系之间是否存在实现差异?

转载 作者:行者123 更新时间:2023-12-05 03:20:21 26 4
gpt4 key购买 nike

我对 OneToOne 与 ManyToOne(不是 OneToMany)的区别感到困惑。

假设我们有一个 Person 类和一个 Department 类。当我们说许多人可以属于一个部门时,我们假设一个 ManyToOne 关系并在 Person 类中添加一个 DeptID 列。这对我来说是有意义的,并且按照所说的那样工作。

但是,如果我们说Person和Department是一对一的关系,这意味着一个人只有一个部门,一个部门只有一个人。然而,这就是问题所在。尽管如此,JPA 还是允许两个 Person 对象共享同一个部门。

人员类别:

@Entity
@Table
public class Person {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
int id;
@Column
int age;
@Column(length = 20)
String name;

@Column(length = 20, nullable = true)
String cnic;

@Column(nullable = true)
boolean married;

@OneToOne
Department dep;
}

部门类:

@Entity
public class Department {
@Id
int Id;
@Column
String name;
}

让两个人拥有相同的部门:

public void testOTO() {
System.out.println("Testing OTO");
Department dep = new Department(202, "CS");
depdb.saveAndFlush(dep);

Person p1 = new Person();
Person p2 = new Person();
p1.setDep(dep);
p2.setDep(dep);

db.saveAndFlush(p1);
db.saveAndFlush(p2);
}

我想问一下,OneToOne 和 ManyToOne 之间的区别只是语义上的还是我遗漏了什么?

最佳答案

JPA 本身无法控制您的一对一关系是否确实是一对一。但是您的数据库模式可以。只需向外键列添加唯一约束。

JPA 不检查这一点的原因是,在应用程序端这样做会非常昂贵。JPA 需要获取整个表的外键列的锁,然后检查要插入的值是否不存在。

另一方面,数据库约束是这种模式。虽然它们仍然需要锁定,但它们只会锁定索引并且会自动执行。

我不确定流行的 JPA 实现在生成模式时是否会生成唯一约束。如果他们不这样做,这可能是因为它会与短时间内存在两个相同值的某些场景发生冲突。如果在创建唯一约束后遇到此类问题,您可能需要检查 your database supports deferred constraints .

关于java - 一对一和多对一实体关系之间是否存在实现差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73190005/

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