在 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 开始