为什么Hibernate 4的逆向工程工具不会为实体类创建关系注释?

时间:2012-11-14 23:00:05

标签: java eclipse hibernate spring-mvc reverse-engineering

我在尝试让Hibernate 4从我的数据库模式中反向设计实体类时遇到了很多困难。我的数据库实际上是一个Derby数据库,但在阅读之后,我听说Derby可能有hibernate逆向工程的问题,所以我决定用MySQL数据库连接生成实体,但是使用生成的实体我的Derby连接(如果有意义的话)。

我安装了JBoss的Hibernate插件的SpringToolsSuite。我进入了数据库开发视角,并创建了一个成功链接到MySQL的数据源。我可以从STS / Eclipse里面很好地探索表格。然后我转到Hibernate透视图并设置控制台配置。再次,这似乎是成功的,从Hibernate的角度来看,我可以浏览表并查看我的数据库表的列定义就好了。然后,我转到Hibernate代码生成配置对话框以创建新配置。我检查“JDBC连接中的逆向工程师”并检查所有启用的选项。 (我不能包含图片,因为我的声誉目前太低了,如果不完全清楚那就很抱歉)

逆向工程师可以使用这些设置并为我完成很多任务,但一个主要问题是正在创建的实体没有正确注释其外键。例如,如果我有Foo并且Foo的一个列是Bar的外键,我希望在Foo的实体类中看到类似的东西:

...
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "barid", nullable = false, referencedColumnName="id")
@ForeignKey(name="FK_BarID")
private Bar bar;
...

但我得到的却没那么有用:

...
@Column(name = "barid")
@NotNull
private Integer barid;
...

目前,我已经决定看看我是否可以使用Hibernate 4的逆向工程功能来使用比我实际尝试使用的模式更小的模式。最好有人报告工作。谷歌搜索后,我找到了一个与我所拥有的问题完全相同的问题(尽管他的解决方案对我的情况不起作用)在线的一个小示例模式:

http://forum.springsource.org/showthread.php?99864-Relationships-and-MySQL-domain-reverse-engineering

我不得不稍微改变他的架构,因为我的MySQL版本中的InnoBD引擎不满意外键只是int,而他们引用的主键是一个bigint。所以我使用以下架构:

create table folder (
    id bigint not null auto_increment,
    title varchar(100) not null,
    primary key (id) 
) ENGINE=InnoDB;

create table language (
    id bigint not null auto_increment,
    name varchar(30),
    code varchar(3),
    primary key (id) 
) ENGINE=InnoDB;

create table document (
    id bigint not null auto_increment,
    folderId bigint not null,
    title varchar(100) not null,
    primary key (id),
    FOREIGN KEY (folderId) REFERENCES folder(id)
) ENGINE=InnoDB;

create table page (
    id bigint not null auto_increment,
    version int not null default 1,
    documentId bigint not null,
    languageId bigint not null default 1,
    fileName varchar(100),
    primary key (id),
    FOREIGN KEY (documentId) REFERENCES document(id),
    FOREIGN KEY (languageId) REFERENCES language(id)
) ENGINE=InnoDB;

我已检查并验证InnoDB处于活动状态并正在使用(使用SHOW TABLE STATUS WHERE NAME ='TableName';命令),但这并不能解决链接所暗示的问题。我想我可以让我的架构工作正常,如果我至少可以让这个基本架构做我想要的,但经过几个小时的尝试,我似乎无法让它识别任何架构的外键。我缺少一步吗?感谢。

0 个答案:

没有答案