Hibernate - 逆向工程师:将@GeneratedValue 添加到所有@Id 字段

Hibernate - Reverse Engineer: Add @GeneratedValue to all @Id fields

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

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

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

我能找到的唯一方法是在我的 reveng.xml 中为每个 table 添加一个条目。由于数据库中 table 的数量(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 次。

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

使用 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 替换就没有意义。

希望这不会长期保持最佳答案。

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

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

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;
}