我有User和Address类如下:
class User
{
...
...
@OneToOne( cascade=CascadeType.ALL)
@JoinColumn(name="addr_id")
private Address address;
}
class Address
{
...
...
@OneToOne(mappedBy="address")
private User user;
}
Run Code Online (Sandbox Code Playgroud)
这里我的假设是这个域模型我可以将一个地址与一个用户关联(user.addr_id应该是唯一的).
但是使用这个域模型,我可以创建多个用户并将它们关联到同一个地址.
User u1 = new User();
//set data
Address addr1 = new Address();
//set data
u1.setAddress(addr1);
...
session.save(u1);
Run Code Online (Sandbox Code Playgroud)
- >这是使用addr_id = 1创建一个地址记录,并在用户表中使用addr_id = 1插入一个用户记录.精细.
再次,
User u2 = new User();
//set data
Address addr1 = (Address) session.load(Address.class, 1);
//set data
u2.setAddress(addr1);
...
session.save(u2);
Run Code Online (Sandbox Code Playgroud)
- >这是创建第二个用户记录并使用addr_id = 1与现有地址相关联,这是不希望的.
我可以使用@OneToOne(..)@ JoinColumn(name ="addr_id",unique = true)来阻止这种情况.但是使用@OneToOne而不是@ManyToOne(..,unique = true)会有什么不同.
@OneToOne本身应该强加"unique = true"条件.
-Siva
@OneToOne正在注释Java以表达两个类之间关系的概念.如果这是一个@OneToMany,那么我们就有了一个集合.因此,阅读注释,我们了解实际情况,JPA运行时也理解这些.
一对一的实际监管是在数据库中执行的 - 我们需要模式具有唯一性约束.@JoinColumn表示如何在DatabaseSchema中显示该关系.如果我们生成模式,这可能很有用.
但是,在许多情况下,我们使用自下而上的工具从架构生成Java.在这种情况下,没有实际需要Java注释来反映数据库约束,从Java角度来看我们只看到这种关系.
如果@JoinColumn的语义与@oneToOne不匹配,智能编译器可能会警告我们,但我不确定当前的实现是否会这样做.
OneToOne是描述对象模型的注释。它说明了关联的基数是什么。unique="true"表示“模型到DDL”工具在此列上应该有唯一的约束。您可以使用这样的工具,但是您也可以自己创建和维护数据库模式。
无论您选择做什么,每次修改OneToOne关联以检查是否遵守基数时,JPA引擎都不会进行查询。它所做的一切都是假设代码正确,并且数据库中的唯一约束将确保遵守基数。
| 归档时间: |
|
| 查看次数: |
5049 次 |
| 最近记录: |