ebean单向@OneToOne与唯一约束的关系

时间:2013-03-06 23:19:36

标签: jpa playframework playframework-2.0 ebean

我有一个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关系,因为我的应用程序中有几个不同的角色(例如驱动程序,教师,代理等),我不想污染用户类那些关系。

我怎样才能做到这一点?

1 个答案:

答案 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