我正在尝试使用休眠注释从 POJO 生成休眠映射。然后我想使用 liquibase 来生成数据库模式。所以我需要在我的 POJO 中定义索引。
示例 POJO:
@Entity
public class A {
@Id
@GeneratedValue
private Long id;
@Index(name = "IDX_NAME")
@ForeignKey(name="sd")
private String name;
}
但是当我在 ant 中运行 HibernateToolTask 时:
<hibernateTool>
<classpath>
<path location="${path}"/>
</classpath>
<annotationconfiguration configurationfile="src/hibernate.cfg.xml"/>
<hbm2hbmxml destdir="${project.dir}"/>
<hbm2ddl destdir="database/liquibase" export="false" outputfilename="update_${stamp}.sql" />
</hibernateTool>
我在映射中没有得到任何索引:
<class name="A" table="A">
<id name="id" type="java.lang.Long" access="field">
<column name="id" />
<generator class="native"></generator>
</id>
<property name="name" type="java.lang.String" access="field">
<column name="name" />
</property>
</class>
同时,当我做 hbm2ddl - 'create index' 生成:
create table A (id bigint not null auto_increment, name varchar(255), primary key (id)) type=InnoDB;
create index IDX_NAME on A (name);
如何让休眠在映射中生成索引?
更新:
我发现,liquibase 使用注释来生成模式,所以这部分问题得到了解决。我还有一个:
我想将现有数据库反向工程为 POJO。POJO 是从映射生成的,映射(使用 jdbcannotation-hbm2hbmxml 生成)没有任何索引。我相信这本质上是相同的问题:hbm2hbmxml 不生成索引。
更新 2:
为什么我需要那个?我有一个现有的数据库架构。我曾经更改它,然后对 POJO 进行逆向工程。现在我想使用 POJO 并通过注释生成映射和模式。
所以我想让 POJO 与当前数据库模式匹配以继续使用它们。显然,除了外键名称和索引之外的所有内容都是匹配的。但是 hbm2java 不会生成 @Index 注释。例如
<hibernateTool>
<jdbcconfiguration propertyfile="${build.dir}/etc/hibernate.properties" packagename="${doPackageName}"/>
<hbm2java destdir="${destinationDir}" jdk5="true" ejb3="true"/>
<hbm2ddl destdir="${destinationDir}" export="false" outputfilename="update_${stamp}.sql" />
</hibernateTool>
此任务在 ddl 中生成索引,而不在 POJO 中生成索引。