【问题标题】:Hibernate - moving annotations from property (method) level to field levelHibernate - 将注释从属性(方法)级别移动到字段级别
【发布时间】:2010-12-24 03:01:15
【问题描述】:

如何从带有字段级别注释的表中生成休眠域类?我使用了 Hibernate Tools 项目并从数据库中的表中生成了域类。生成的类在 getter 方法上而不是在字段级别上具有注释。请建议一种生成具有注释字段的域类的方法。 eclipse/IDEA 等中是否有任何重构工具可用于将注释从方法级别移动到字段级别?

感谢您的帮助和时间。

【问题讨论】:

    标签: reverse-engineering hibernate-annotations


    【解决方案1】:

    目前需要使用自定义模板。这里有更多的参考和例子来实现这个: https://forum.hibernate.org/viewtopic.php?f=6&t=1003858&p=2429868#p2429868

    【讨论】:

      【解决方案2】:

      步骤如下:

      1. 通过在 eclipse 文件夹中执行搜索来分配“hibernate-tools.jar” 例如,您会在以下位置找到它 C:\eclipse\plugins\org.hibernate.eclipse_3.4.1.xxx\lib\tools

      2. 解压到临时文件夹(WinRar 可以这样做) 比如解压到[Your Project]\template

      3. 在 [Your Project]\template\pojo 文件夹下,创建一个名为“Ejb3FieldGetAnnotation.ftl”的文件

        此文件实际上是“Ejb3PropertyGetAnnotation.ftl”的副本,但所有单词“property”都被“field”替换,因为该文件将放置在遍历所有字段(而不是属性)的循环中。 我在这篇文章中包含了文件的内容

      4. 移除属性级注解: 在文件“PojoPropertyAccessors.ftl”中,删除或注释掉

        <#include "GetPropertyAnnotation.ftl"/>
        
      5. 添加字段级注释: 在“PojoFields.ftl”文件中,添加

        <#include "Ejb3FieldGetAnnotation.ftl"/>
        ${pojo.getFieldModifiers(field)} ... 
        
      6. 生成 Java 实体时,选择“使用自定义模板”并指定模板文件夹。在这种情况下,它将是 [Your Project]\template

        ==================================================================================
        Ejb3FieldGetAnnotation.ftl
        ==================================================================================
        
        <#if ejb3>
        <#if pojo.hasIdentifierProperty()>
        <#if field.equals(clazz.identifierProperty)>
         ${pojo.generateAnnIdGenerator()}
        <#-- if this is the id property (getter)-->
        <#-- explicitly set the column name for this property-->
        </#if>
        </#if>
        
        <#if c2h.isOneToOne(field)>
        ${pojo.generateOneToOneAnnotation(field, cfg)}
        <#elseif c2h.isManyToOne(field)>
        ${pojo.generateManyToOneAnnotation(field)}
        <#--TODO support optional and targetEntity-->    
        ${pojo.generateJoinColumnsAnnotation(field, cfg)}
        <#elseif c2h.isCollection(field)>
        ${pojo.generateCollectionAnnotation(field, cfg)}
        <#else>
        ${pojo.generateBasicAnnotation(field)}
        ${pojo.generateAnnColumnAnnotation(field)}
        </#if>
        </#if>
        

      希望它对你有用。

      【讨论】:

      • 非常好,节省了我很多时间,而不必弄清楚这些模板是如何工作的。只是为了向其他人澄清:在第 5 步中,在(!)“${pojo.getFieldModifiers(field)}”之前添加“”,后者已经存在(添加换行符使文件更具可读性)。并在“EJB3FieldGetAnnotation.ftl”中删除标题或使用以下语法进行注释:
      【解决方案3】:

      我花了很多时间阅读 5 多年前的答案,但不了解如何去做(尤其是如果您在 Intellij 而不是 Eclipse 中工作)以及为什么还没有解决这个问题。于是我找到了,就在这里,而且很简单:

      在 Intellij 中:

      1. 在与您的 persistence.xml 相同的文件夹中创建一个文件 orm.xml 并包含此内容
      <?xml version="1.0" encoding="UTF-8"?>
          <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
                           version="2.0">
              <persistence-unit-metadata>
                  <persistence-unit-defaults>
                      <access>FIELD</access>
                  </persistence-unit-defaults>
              </persistence-unit-metadata>
          </entity-mappings>
      
      1. 现在您可以生成您的 pojo(生成持久性映射 -> 按数据库架构 -> 选择您的表等,不要忘记勾选“生成 JPA 注释”)

      您的实体将具有字段注释!

      @Entity
      @Table(name = "user", schema = "public", catalog = "my_db")
      public class User {
          @Id
          @Column(name = "id")
          private Integer id;
      ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-21
        • 1970-01-01
        • 2019-11-20
        • 1970-01-01
        • 2023-01-23
        相关资源
        最近更新 更多