我正在开发一个 Spring(4.x)-Hibernate(5.2.x) 网络应用程序项目。
模型类
@Entity
@Table( name = "users" )
public class User {
@Id
@Column( name="ID" )
@GeneratedValue( strategy = GenerationType.IDENTITY )
private Long id;
@Temporal( TemporalType.TIMESTAMP )
@Column( name="CREATED_AT", insertable=false, nullable=false )
@Generated( GenerationTime.INSERT )
private Date createdAt;
@Temporal( TemporalType.TIMESTAMP )
@Column( name="UPDATED_AT", insertable=false, updatable=false, nullable=false )
@Generated( GenerationTime.ALWAYS )
private Date updatedAt;
public enum Role {
ADMIN,
USER,
GUEST
}
@NotNull
@Column( name="ROLE" )
@Enumerated( EnumType.STRING )
private Role role;
//getters & setters
}
hibernate 属性
hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.show_sql = true
hibernate.format_sql = true
hibernate.hbm2ddl.auto = update
自动生成查询
create table users (
ID bigint not null auto_increment,
CREATED_AT datetime not null,
UPDATED_AT datetime not null,
ROLE varchar(255) not null,
primary key (id)
)
我希望有一个查询
CREATED_AT DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
和UPDATED_AT DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP
和ROLE ENUM('ADMIN','USER','GUEST') VARCHAR(255) NOT NULL
这是它的工作方式还是我的配置错误?做了一些搜索,但没有找到明确的解决方案,除了这些,
@Column(name="CREATED_AT", nullable = false,columnDefinition="TIMESTAMP default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP")
@ColumnDefault( "NOW()")
但是这些定义取决于底层数据库,我是这么认为的。需要一个更 java/hibernate 明智的配置,就像我使用的那样,但不起作用!
最佳答案
使用当前版本的 jpa( hibernate 提供程序),
columnDefinition and @ColumnDefault
标识要通过 DDL(数据定义语言)应用于关联列的默认值。
因此似乎不可能像您预期的那样生成具有基于 java 的默认值列的表
CREATED_AT DATETIME NOT NULL DEFAULT CURRENT_TIMESTAM
如果我们想切换到其他数据库服务器(oracle -> mysql),因为 DDL 语法可能不同,这很不方便。但是jpa以后可能会有这个功能(也许)
解决方法是针对您的问题,您必须对 DDL 使用默认值。
开发人员经常使用另一种方法来确保您的列始终在插入之前进行初始化。但它不会为数据库中的列生成默认值。
@PrePersist
void preInsert() {
if (this.createdTime == null)
this.createdTime = new Date();
}
其他开发者使用sql native查询可能会失败。
如果您找到其他解决方案,请指正并希望对您有所帮助!
关于java - Hibernate 模型类配置未反射(reflect)在具有 "hibernate.hbm2ddl.auto = update"的 CREATE TABLE 查询中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45295058/