2015-07-03 43 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替換是沒有意義的。

希望這並不是最長的最佳答案。