xde*_*dev 5 jpa playframework ebean playframework-2.0
我有一个User类:
@Entity
public class User extends Model {
@Id
public Long id;
public String email;
public String name;
public String password;
}
Run Code Online (Sandbox Code Playgroud)
和一个驾驶舱
@Entity
public class Driver extends Model {
@Id
public Long id;
@OneToOne (cascade = CascadeType.ALL)
@Column(unique = true)
public User user;
}
Run Code Online (Sandbox Code Playgroud)
我想确保user_id在Drivers表中是唯一的。但是上面的代码并没有强制执行。(我可以使用相同的用户ID创建多个驱动程序)。
理想情况下,我不想在User类中添加@OneToOne关系,因为我的应用程序内部有几个不同的角色(例如,驱动程序,老师,代理等),并且我不想使用所有这些关系来污染用户类。
我该如何实现?
我已经在模型上尝试过这段代码,并且它有效。需要注意的一件事是,您必须使用@OneToOne注释来让 ORM 知道您具有对其他模型的外键引用。
该模型如下所示:
@Entity
// add unique constraint to user_id column
@Table(name = "driver",
uniqueConstraints = @UniqueConstraint(columnNames = "user_id")
)
public class Driver extends Model {
@Id
public Long id;
@OneToOne
@JoinColumn(name = "user_id")
public User user;
}
Run Code Online (Sandbox Code Playgroud)
它将生成如下的进化脚本:
create table driver (
id bigint not null,
user_id bigint,
constraint uq_driver_1 unique (user_id), # unique database constraint
constraint pk_driver primary key (id)
);
Run Code Online (Sandbox Code Playgroud)
因此,通过这种方法,您可以确保您user在表格上拥有唯一的参考driver。
附加信息
因为有一个额外的约束,它不是由框架处理的,而是由应用于模型的数据库处理的(例如
unique约束),为了验证输入或处理发生的异常,您可以使用包围Model.save()或form.get().save()表达式(保存模型) withtry-catch块来处理PersistenceException。
| 归档时间: |
|
| 查看次数: |
2586 次 |
| 最近记录: |