java - Hibernate 模型类配置未反射(reflect)在具有 "hibernate.hbm2ddl.auto = update"的 CREATE TABLE 查询中

标签 java mysql hibernate

我正在开发一个 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/

相关文章:

java - com.thoughtworks.xstream.converters.ConversionException

java - 使用 List 或 Set 创建一个简单数组

php - 为什么PHP在mysql表数据库中插入变量名

php - 将图像插入数据库并编码 ="multipart/form-data"

php - MySQL 数据库和网站上显示的奇怪字符

java - JPA参照完整性约束违反oneToMany和批量操作查询

java - @ElementCollection with Map<Entity, Embeddable> 其中 Entity 是 Embeddable 的字段

java - Spring不扫描包

java - 确定用于调用子类中方法的父类(super class)引用

java - 电子邮件日志文件,由 Java WebLogic 应用程序服务器生成