【问题标题】:Hibernate - Reverse Engineer: Add @GeneratedValue to all @Id fieldsHibernate - 逆向工程师:将@GeneratedValue 添加到所有@Id 字段
【发布时间】:2015-09-21 08:16:42
【问题描述】:

我正在尝试使用 Hibernate 对 Oracle 11g 数据库进行逆向工程。我希望 Hibernate 为我的 @Id 列生成值,但是 Oracle 11g 不支持标识列。因此,当我对数据库进行逆向工程时,不会创建 @GeneratedValue 注释。

有没有办法让逆向工程过程自动在每个@Id 注释旁边包含一个@GeneratedValue 注释? 例如

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="identity_sequence")

我能找到的唯一方法是在我的 reveng.xml 中为每个表包含一个条目。由于数据库中的表数量(100s),我试图避免这种方法。

<table name="{table name}">
    <primary-key>
        <generator class="GenerationType.SEQUENCE">
            <param name="sequence">IDENTITY_SEQ</param>
        </generator>
        <key-column name="ID"/>
    </primary-key>
</table>

重复 100 次。

【问题讨论】:

    标签: oracle hibernate auto-generate


    【解决方案1】:

    我在this论坛找到了您问题的答案。

    基本上你必须提供一个custom reverse engineering strategy 类。
    在那里您实现了方法getTableIdentifierStrategyName,它返回实现org.hibernate.id.IdentifierGenerator 的类的完全限定名。 您可以使用该方法的identifier 参数进一步将生成器类限制为某些表。
    下面概述的示例将为所有表使用序列标识符生成器。

    public class CustomReverseEngineeringStrategy extends DelegatingReverseEngineeringStrategy {
    
        public CustomReverseEngineeringStrategy(ReverseEngineeringStrategy delegate) {
            super(delegate);
        }
    
        public String getTableIdentifierStrategyName(TableIdentifier identifier) {
            return org.hibernate.id.enhanced.SequenceStyleGenerator.class.getName();
        }
    }
    

    在您的 JDBCConfiguration 逆向工程任务中指定该策略。

    jdbcconfiguration(propertyfile: "hibernate.properties",
                      packagename: "de.mypackage",
                      reversestrategy: "de.mypackage.CustomReverseEngineeringStrategy",
                      detectManytoMany: true,
                      detectOptimisticLock: false)
    

    这将在每个@Id 注释旁边生成@GeneratedValue 注释,如下所示:

    @GenericGenerator(name = "generator", strategy = "org.hibernate.id.SequenceIdentityGenerator")
    @Id
    @GeneratedValue(generator = "generator")
    @Column(name = "id", unique = true, nullable = false)
    public Integer getId() {
        return this.id;
    }
    

    【讨论】:

      【解决方案2】:

      警告 - 这不是一个优雅的解决方案

      使用 Maven:

      1) 正常对数据库进行逆向工程:

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>hibernate3-maven-plugin</artifactId>
        ...
      

      2) 将@Id 替换为所需的代码并导入:

      <plugin>
        <groupId>com.google.code.maven-replacer-plugin</groupId>
        <artifactId>replacer</artifactId>
        ...
        <replacements>
          <replacement>
            <token>@Id</token>
            <value>@Id
              @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="identity_sequence")
              @SequenceGenerator(name="identity_sequence",
                                  sequenceName="IDENTITY_SEQ", allocationSize=20)
            </value>
          </replacement>
          <replacement>
            <token>import javax.persistence.Id;</token>
            <value>import javax.persistence.Id;
              import javax.persistence.GeneratedValue;
              import javax.persistence.GenerationType;
              import javax.persistence.SequenceGenerator;
            </value>
          </replacement>
      

      3) 整理生成的代码:

      <plugin>
        <groupId>com.googlecode.maven-java-formatter-plugin</groupId>
        <artifactId>maven-java-formatter-plugin</artifactId>
        ...
      

      这个解决方案有很多缺陷。例如,如果您有任何视图(或任何其他没有数字主键的视图),那么进行 @Id 替换是没有意义的。

      希望这不会在很长时间内保持最佳答案。

      【讨论】:

        猜你喜欢
        • 2011-07-24
        • 2014-06-15
        • 1970-01-01
        • 1970-01-01
        • 2015-09-27
        • 1970-01-01
        • 2012-03-15
        • 2011-11-17
        • 2015-08-11
        相关资源
        最近更新 更多