在 Hibernate 中使用注释定义默认列值

Posted

技术标签:

【中文标题】在 Hibernate 中使用注释定义默认列值【英文标题】:Define default column value with annotations in Hibernate 【发布时间】:2015-03-22 08:28:53 【问题描述】:

我知道在 SO 和网络上有很多这样的问题,但所有答案都建议使用 columnDefinition,这是特定于数据库的,因此不适用于我,因为我正在处理的系统需要运行在不同的数据库上。

我发现了这个hibernate issue,有人在其中请求使用此功能进行注释。该问题已关闭,称another issue 将涵盖该功能。第二个问题显然添加了注释@Generated 以及其他一些注释,但我找不到任何有关如何使用这些新注释定义默认列值的文档。

所以我的问题是:有谁知道我如何定义带有注释的默认列值(而不是使用columnDefinition)?

编辑: 进一步澄清我的问题:当我添加一个新的非空列时,我需要 Hibernate 来更新现有架构(将新列添加到相应的表中)。但是由于该列是非空的,数据库不能在不指定默认值的情况下创建该列(如果表中已经有一些行)。所以我需要指示 Hibernate 发出以下 DDL 语句:ALTER TABLE my_table ADD COLUMN new_column VARCHAR(3) DEFAULT 'def',但它必须独立于使用的数据库。

【问题讨论】:

【参考方案1】:

我认为您不需要任何文档,java 文档是自我解释的。 如果我理解正确,您需要一种为字段设置默认值的方法。如果是请看下面的代码sn-p。

@Entity
@Table(name = "my_entity")
public class SomeEntity extends BaseEntity 

public static final class MyValueGenerator implements
        ValueGenerator<String> 
    @Override
    public String generateValue(Session session, Object owner) 
        return "This is my default name";
    


@Basic
@Column(name = "name", insertable = true, updatable = true, nullable = false, length = 255)
// This will add a DDL default
@ColumnDefault("'This is my default name'")
// This will add a runtime default.
@GeneratorType(type = MyValueGenerator.class)
private String name;

// getters and setters


【讨论】:

谢谢,但这似乎只是在插入的实体上生成值。那不是我需要的。当 DDL 语句添加列时,我需要定义默认列值(我编辑了我的问题以使其更清晰)。 @Jardo 你试过'@ColumnDefault'注解吗?我将更新我的代码以反映更改。 @Bbl 这正是我需要的谢谢。我只有一句话:Hibernate 将注释中的值直接放入 DDL 语句中,因此如果要插入字符串,则必须使用附加引号对其进行转义,否则会出现 SQL 错误。喜欢这个@ColumnDefault("'This is my default name'")。如果您编辑答案以反映这一点,那将是完美的:) @ColumnDefault 注释用于指定使用自动模式生成器时要应用的 DEFAULT DDL 值。 (来自docs.jboss.org/hibernate/orm/5.2/userguide/html_single/…) 如何从另一个表中获取默认值?我必须从名为 country 的表中设置默认值,其中 PK 是 country_id(我想将其设置为默认值 where countryname="US")【参考方案2】:

以下对我有用。

@ColumnDefault("'0.0'")

@Column(name = "avgRating")

私人浮动 avgRating;

【讨论】:

以上是关于在 Hibernate 中使用注释定义默认列值的主要内容,如果未能解决你的问题,请参考以下文章

JPA 或 Hibernate 生成(非主键)列值,不是从 1 开始

Hibernate 默认模式和表注释

默认列值在休眠中不起作用

Hibernate:从应用程序而不是数据库插入列值

如何在 Hibernate Search/Lucene 中禁用默认评分/提升?

Hibernate 注释用法