我在尝试让 Hibernate 4 从我的数据库模式中对实体类进行逆向工程时遇到了很多困难。我的数据库实际上是一个 Derby 数据库,但是在阅读之后,我听说 Derby 可能存在休眠逆向工程问题,所以我决定使用 MySQL 数据库连接生成实体,但使用生成的实体我的德比联系(如果有任何意义的话)。
我有安装了 JBoss 的 Hibernate 插件的 SpringToolsSuite。我从数据库开发的角度出发,创建了一个成功链接到 MySQL 的数据源。我可以从 STS/Eclipse 内部很好地探索这些表。然后我进入 Hibernate 透视图并设置控制台配置。同样,这似乎是成功的,从 Hibernate 的角度来看,我可以浏览表并查看数据库表的列定义。然后我转到 Hibernate Code Generation Configurations 对话框来创建一个新配置。我选中“从 JDBC 连接进行反向工程”并检查所有 4 个已启用的选项。(我不能包含图片,因为我目前的声誉太低,如果这不完全清楚,请见谅)
逆向工程师确实使用这些设置并为我完成了很多任务,但一个主要问题是正在创建的实体没有正确注释它们的外键。例如,如果我有 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 的逆向工程功能使用比我实际尝试使用的更小的模式。最好是有人报告为工作的人。在谷歌搜索之后,我发现有人与我遇到的问题完全相同(尽管他的解决方案不适用于我的情况)在线一个小示例模式:
我不得不稍微改变他的模式,因为我的 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'; 命令),但这并不能解决链接所暗示的问题。我想如果我至少可以让这个基本模式做我想做的事,我可以让我的模式正常工作,但是经过数小时的尝试,我似乎无法让它识别任何模式的外键。有没有我遗漏的步骤?谢谢。