2015-07-03 41 views
0

我正在尝试使用Hibernate来反向工程Oracle 11g数据库。我希望Hibernate为我的@Id列生成值,但Oracle 11g不支持标识列。因此,当我逆向设计数据库时,不会创建@GeneratedValue注释。休眠 - 反向工程:将@GeneratedValue添加到所有@Id字段

有没有办法让逆向工程过程自动包括每个@Id注释旁的@GeneratedValue注解? 例如

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

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

I.e.

<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次。

回答

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

警告 - 这不是一个很好的解决方案

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

希望这并不是最长的最佳答案。