7

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))
;
4

2 に答える 2

12

自分自身を次のcolumnDefinitionように使用します。

@Column(columnDefinition = "integer default 2")
public Integer size = 2;
于 2014-02-04T16:09:06.680 に答える
0

別のオプションは、@PrePersistタグ packageを使用することjavax.persistenceです。Bean でメソッドを装飾することができ@PrePersist、そのメソッドは Ebean.save 呼び出しの前に呼び出されます。したがって、この場合、次のコードは size のデフォルト値を 2 に設定します。

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

このアプローチは、ORM (Ebean) のコンテキスト内でのみ適用可能であり、明らかに SQL では直接機能しません。この方法の利点はinteger default 2、いくつかの未知の奇妙な RDBMS システムでは有効な列定義文字列ではない可能性があるという意味で、よりデータベースに依存しないことです。

于 2016-05-24T18:31:51.110 に答える