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;
}
我正在尝试使用 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;
}