【问题标题】:ebean unidirectional @OneToOne relation with unique constraint具有唯一约束的 ebean 单向 @OneToOne 关系
【发布时间】:2013-03-06 23:19:36
【问题描述】:

我有一个用户类:

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

我怎样才能做到这一点?

【问题讨论】:

    标签: jpa playframework playframework-2.0 ebean


    【解决方案1】:

    我已经在模型上为我尝试过这段代码,并且成功了。需要注意的一点是,您必须使用 @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)
    );
    

    因此,通过这种方法,您可以确保您在 driver 表上拥有唯一的 user 引用。


    附加信息

    因为有一个额外的约束,不是由框架处理,而是由应用在模型上的数据库(unique约束)来验证输入或处理发生的异常,您可以用try-catch 块包围Model.save()form.get().save() 表达式(saving-the-model)来处理PersistenceException

    【讨论】:

      猜你喜欢
      • 2014-07-15
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      相关资源
      最近更新 更多