默认值不在hibernate状态下工作
我使用columnDefinition
来指定列的默认值,但是它不存储它只存储null的默认值,
请帮忙解决这个问题,下面是我的代码
private String sourceFrom; @Column(name = "SourceFrom", columnDefinition = "varchar(15) default 'Case'") public String getSourceFrom() { return sourceFrom; } public void setSourceFrom(String sourceFrom) { this.sourceFrom = sourceFrom; }
在DDL阶段使用@Column.columnDefinition
创建表,而不是在正常程序运行期间; 可能您必须使用@DynamicInsert/@DynamicUpdate
:此注释仅插入(或更新)您在POJO中设置的属性,并让RDBMS管理其他字段。
一个小例子
@Entity class MyTable { @Id private int code; @Column(name = "SourceFrom", columnDefinition = "varchar(15) default 'Case'") private String sourceFrom; }
这是DDL阶段生成的代码
create table mytable (code integer not null,SourceFrom varchar(15) default 'Case')
MyTable t = new MyTable(); t.setCode(10); session.save(t);
会做这个声明
insert into mytable (code, SourceFrom) values (10,NULL)
MyTable t = new MyTable(); t.setCode(10); t.setSourceFrom("MANUAL INSERT"); session.save(t);
会做这个声明
insert into mytable (code, SourceFrom) values (10,'MANUAL INSERT')
如果使用@DynamicInsert
注释MyTable
,则第一个示例将生成此语句
insert into mytable (code) values (10)
如您所见,未指定字段SourceFrom
的值,并且插入到数据库表中的值由列定义默认值(在本例中为'Case'
)定义。
手动处理默认值(在setter中,使用@PrePersist
或其他解决方案)仍然有效。
您提出的解决方案应该可以使用,但与数据库有关,因此您可能需要检查语法是否真正适用于您的具体数据库。 另一种更通用的方法是
@PrePersist void preInsert() { if ( getSourceFrom() == null ) { setSourceFrom( "Case" ); } }
干杯,
您的默认值在数据库中定义,因此Hibernate不使用它。 默认值由数据库设置,但您创建的实体已经处于hibernate缓存中(它可以是会话缓存或L2缓存)。
如果你加载实体它来自Hibernate缓存而不是数据库。
要解决此问题,请执行以下操作之一:
- 刷新实体
session.refresh(yourEntity)
- 使用java而不是默认值初始化它
- 使用
@PrePersist
监听器
在DB端创建默认值。 如果要在实体映射中使用它,只需设置默认值,如下所示
private String sourceFrom =“Case”;
- Hibernate和NonUniqueObjectException
- Hibernate,Persistence和@OneToMany以及@ManyToOne注释问题
- Grails,使用withTransaction插入大量数据会导致OutOfMemoryError
- 什么是@JoinColumn以及如何在Hibernate中使用它
- 当我只访问外键id时,如何阻止Hibernate获取已连接的实体?
- 没有@Transactional注释的Spring托管事务
- 如何在Java Hibernate应用程序中修复java.lang.ArrayIndexOutOfBoundsException
- 可以在hbm.xml中映射的属性是暂时的吗?
- JPA2 / Hibernate – 停止延迟加载?