【问题标题】:JPA @Column annotation to create comment/descriptionJPA @Column 注释以创建注释/描述
【发布时间】:2015-04-30 15:13:40
【问题描述】:

我想知道是否可以像这样从 jpa/hibernate 注释创建数据库列描述/注释:

ALTER TABLE tablename CHANGE status status INT(11) NOT NULL COMMENT 'sample description/comment';

这将是很棒的功能,但我在 JPA 规范中找不到任何关于此的内容。

也许我应该使用@Column(columnDefinition="") 属性,但我没有任何线索。 请帮忙

【问题讨论】:

    标签: java mysql sql hibernate jpa


    【解决方案1】:

    我找到了自己问题的答案。

    我不确定是否可以?它适用于所有数据库吗?

    当然它适用于 mysql

    这是工作代码:

    @Column(columnDefinition=" INT(11) NOT NULL COMMENT '0 for no action, 1 for executed, 2 for validated, 3 for aproved'")
    private int status;
    

    【讨论】:

    • 它将给定的文本附加到创建语句中,因此只要 columnDefinition 与底层数据库匹配,它就可以工作
    • 由于不是所有的 RDBMS 都支持针对 COLUMN 的“COMMENT”(Postgresql、HSQLDB、Derby 等等),所以这肯定只适用于非常有限的一组 RDBMS。此外,将其放在注释中意味着编译后的代码与那些允许该语法的 RDBMS 相关联,而如果将其放在 XML 文件中,则可以根据正在使用的 RDBMS 换出 orm.xml 文件。
    • 是的。我同意你们。但找不到更好的解决方案。 XML 是什么意思?
    • Table可以吗?
    • 我想我也可以使用 @Table 注释,但尚未测试。
    【解决方案2】:

    表格注释的注释说明已存在。为此,我们必须使用 Hibernate @Table 注解,与 JPA @Table 注解互补。

    例如:

    @javax.persistence.Table( name = "Cat" )
    @org.hibernate.annotations.Table( comment = "Table for cats" )
    public class Cat {
    ...
    

    关于专栏评论: 似乎没有等价物,即使在 Hibernate 5.2 / JPA 2.1 中也是如此。

    很久以前(2007 年)就该主题提交了一个问题,但仍未解决:Support @Comment or column attribute on @Table and @Column。自 2012 年以来被遗弃?

    我还在 org.hibernate.dialect.Dialect 中发现了评论用法:

    /**
     * Does this dialect/database support commenting on tables, columns, etc?
     *
     * @return {@code true} if commenting is supported
     */
    public boolean supportsCommentOn() {
        return false;
    }
    
    /**
     * Get the comment into a form supported for table definition.
     *
     * @param comment The comment to apply
     *
     * @return The comment fragment
     */
    public String getTableComment(String comment) {
        return "";
    }
    
    /**
     * Get the comment into a form supported for column definition.
     *
     * @param comment The comment to apply
     *
     * @return The comment fragment
     */
    public String getColumnComment(String comment) {
        return "";
    }
    

    例如 PostgreSQL81Dialect 支持它(supportsCommentOn() 返回 true)。

    它允许使用 SQL 命令“COMMENT ON ...”, 就像在 PostgreSQL (https://www.postgresql.org/docs/current/static/sql-comment.html) 中一样。
    例如:

    COMMENT ON TABLE my_schema.my_table IS 'Employee Information';
    COMMENT ON COLUMN my_table.my_column IS 'Employee ID number';
    

    似乎在那里使用:org.hibernate.tool.schema.internal.StandardTableExporter#getSqlCreateStrings

    该列的注释是从使用 org.hibernate.mapping.Column#getComment 的 Hibernate 映射中提取的。

    最后,如果使用Hibernate Tools和逆向工程,列的注释是从JDBC DatabaseMetaData中提取的,使用org.hibernate.cfg.reveng.BasicColumnProcessor#processBasicColumns

    -> String comment = (String) columnRs.get("REMARKS");
    

    【讨论】:

      【解决方案3】:

      虽然将域模型映射到关系数据需要 Hibernate 映射,但将此功能扩展到生成数据库架构也不是一个好主意。

      这可能适用于一个相对较小的项目,但是当您有一个随着每次 Sprint 迭代而发展的大中型企业应用程序时,您就需要一个数据库架构迁移工具,例如 Flyway

      注释不需要域模型映射,因为它是关系特定的描述。领域模型应该使用 JavaDocs 来记录每个字段的含义(根据特定的领域逻辑要求)。

      【讨论】:

      • 应该注意的是,您应该使您的数据库架构和生成的模型保持同步。否则,当事情不同时,你迟早会遇到麻烦。我通常有自动化测试来比较迁移的(使用如上所述的 flyway)和生成的模式。
      • 您是否根据开发环境验证架构?那大多没有意义。 DBA 可能会在生产服务器上进行更改,从而破坏您测试的迁移脚本))我要求生产 DDL,将其应用于开发环境并针对它进行测试。
      • 当然有道理。通过这种方式,您可以将所有模式更改存储在 Git 中,DBA 也可以在那里添加一个新脚本。手动向数据库添加更改就像在生产中的应用程序 jar 中注入修改后的类。
      猜你喜欢
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 2021-10-01
      • 2011-04-17
      • 2011-08-24
      • 2014-12-15
      • 2022-12-30
      相关资源
      最近更新 更多