Play Framework 2 Ebean 为字段指定默认值

Posted

技术标签:

【中文标题】Play Framework 2 Ebean 为字段指定默认值【英文标题】:Play Framework 2 Ebean specify default value for field 【发布时间】:2014-02-04 15:09:01 【问题描述】:

我在 Play Framework 2 中有一个简单的模型,如果执行 INSERT 时没有提供任何值,我想指定一个默认值插入到指定的 INT 列上。

型号:

@Entity
@Table(name = "DashboardOptions", schema = "dbo")
public class DashboardOptions extends Model implements Serializable 
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    public Long id;

    @Basic(optional = false)
    @Column(name = "userId")
    public Long userId;

    @Column(name = "chartType")
    public String chartType;

    public String name;

    public Integer size = 2;

我希望size 列默认填充2,但是,如果我如上所述指定默认值,我的数据库演变不会反映这一点:

create table dbo.DashboardOptions (
id                        numeric(19) identity(1,1) not null,
userId                    numeric(19) not null,
chartType                 varchar(255),
name                      varchar(255),
size                      integer,
constraint pk_DashboardOptions primary key (id))
;

我希望看到的是:

create table dbo.DashboardOptions (
id                        numeric(19) identity(1,1) not null,
userId                    numeric(19) not null,
chartType                 varchar(255),
name                      varchar(255),
size                      integer default 2,
constraint pk_DashboardOptions primary key (id))
;

【问题讨论】:

【参考方案1】:

像这样使用自己的columnDefinition

@Column(columnDefinition = "integer default 2")
public Integer size = 2;

【讨论】:

太棒了,做到了!谢谢一堆。我以前见过(甚至使用过)列定义,但我认为它仅限于指定列的数据类型。完美答案!【参考方案2】:

另一种选择是使用@PrePersist 标签包javax.persistence。您可以使用@PrePersist 在您的bean 中装饰一个方法,并在调用Ebean.save 之前调用该方法。所以在这种情况下,下面的代码会将 size 的默认值设置为 2。

@PrePersist
protected void onCreate 
  if (this.size == null)
          this.size = 2;

这种方法仅适用于 ORM (Ebean) 的上下文,显然不能直接用于 SQL。这种方法的优点是,在某些未知的奇怪 RDBMS 系统中,integer default 2 可能不是有效的列定义字符串。

【讨论】:

以上是关于Play Framework 2 Ebean 为字段指定默认值的主要内容,如果未能解决你的问题,请参考以下文章

数据库“默认”需要进化!尝试使用 play framework 2.7.0 和 Ebean 连接到 MySQL 时

Play Framework - Ebean - 没有为类“类名”注册 ScalarType

获取使用 Ebean 在 Play Framework 中保存的最新更新行

Ebean和Play!不使用.select()过滤列

未解决的依赖关系 sbt with play framework

玩!框架+Ebean