5

我有一个用户类:

@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;
}

我想确保 user_id 在 Drivers 表中是唯一的。但是上面的代码并没有强制执行。(我可以创建多个具有相同用户 ID 的驱动程序)。

理想情况下,我不想在 User 类中添加 @OneToOne 关系,因为我的应用程序中有几个不同的角色(例如司机、教师、代理等),我不想用所有这些关系污染用户类。

我怎样才能做到这一点?

4

1 回答 1

4

我已经在模型上为我尝试了这段代码,并且它有效。需要注意的一件事是,您必须使用@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()表达(保存模型) withtry-catch块来处理PersistenceException

于 2013-04-24T04:27:12.570 回答