【问题标题】:Do I need redundant JPA annotations if the database has already been created in a SQL script?如果数据库已经在 SQL 脚本中创建,我是否需要冗余的 JPA 注释?
【发布时间】:2017-11-14 12:15:05
【问题描述】:

这感觉一点也不干。

我有一个生成所有数据库表的 SQL 脚本,所以我的 @Entity 类中有很多冗余注释。

例如,

@Column(unique = true, length = 254)
@NotNull
private String email;

或自动递增逻辑,例如

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

考虑到在我已经声明过的 SQL 中,所有这些字段注释都是多余的。

有什么理由保留这些注释吗?据我了解,任何一种严肃的应用程序都应该使用 SQL 脚本来创建数据库表,而且在我正在编写的类中减少噪音肯定会很好。

【问题讨论】:

    标签: java hibernate jpa orm dry


    【解决方案1】:

    您的示例中有两种类型的注释(DDL 和验证类型):

    @Column(unique = true, length = 254)
    @NotNull
    
    1. @NotNull 是一个 JSR 303 Bean 验证注解。它与数据库约束本身无关。它由验证处理器使用,不与数据库连接。所以它在你的映射中不是多余的。 但是,例如

      @Column(nullable = false) - 它为 jpa 提供程序提供提示,以生成正确的 DDL 以创建具有数据库约束的表列

    2.@Column(unique = true, length = 254)它们是hibernate生成的ddl的提示。

    但对于 @Column(可更新 = 假,名称 = "flight_name",可空 = 假,长度 = 50) 可更新 - 这不是 ddl ,而​​是优化。

    from hibernate docs

    @Column(
        ddl/mapping : name="columnName"; 
        optimization: boolean insertable() default true;
        optimization: boolean updatable() default true;
        ddl/mapping  : String table() default "";
        DDL -->: boolean unique() default false;
        DDL -->: boolean nullable() default true;
        DDL -->: String columnDefinition() default "";
        DDL -->: int length() default 255;
       ......
    )
    

    如果您使用 ddl 脚本,所有 hibernate ddl-annotation 属性都是多余的(如果您在内存测试中使用,内存中的 db 将会自动生成),并且只有在您配置了 hibernate.hbm2ddl 时才会使用。 hibernate/jpa 配置中的自动选项。当您授予休眠权限以在生产中执行 DDL 时,这也是非常危险的场景。

    用于生产:请参阅liquibaseflywaydb 了解 DDL。

    【讨论】:

      【解决方案2】:

      我想到的两个原因:

      1. 当您让 hibernate 在用于测试的内存数据库中创建和删除模式时,它们在集成测试中很有用。
      2. Hibernate 在运行时也使用它们中的很少一部分来生成一些 optimizations,例如 optional = false(不为空)与 @PrimaryKeyJoinColumn 结合使用,当 Hibernate 知道它是安全的时为惰性关联做一个代理,而不是切换到急切加载。

      【讨论】:

        猜你喜欢
        • 2018-09-11
        • 2023-03-04
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多