我有一个User类:
@Entity
public class User extends Model {
@Id
public Long id;
public String email;
public String name;
public String password;
}
和一个驱动程序类
@Entity
public class Driver extends Model {
@Id
public Long id;
@OneToOne (cascade = CascadeType.ALL)
@Column(unique = true)
public User user;
}
我想确保在Drivers表中user_id是唯一的。但上面的代码并没有强制执行。 (我可以使用相同的用户ID创建多个驱动程序。)
理想情况下,我不想在User类中添加@OneToOne关系,因为我的应用程序中有几个不同的角色(例如驱动程序,教师,代理等),我不想污染用户类那些关系。
我怎样才能做到这一点?
答案 0 :(得分:3)
我已经在模型上尝试了这个代码,但它确实有效。需要注意的一点是,必须使用@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;
}
它将生成如下的进化脚本:
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)
);
因此,使用此方法,您可以确保在user
表格上有唯一的driver
引用。
其他信息
因为有一个额外的约束,它不是由框架处理,而是由模型上应用的数据库处理(,例如
unique
约束),要验证输入或处理发生的异常,您可以使用Model.save()
块包围form.get().save()
或try-catch
表达式(保存模型)以处理<强>的PersistenceException 强>