实际的项目开发中, 我们可能需要根据已有的数据库模型来创建Cayenne的配置文件和相关的实体类. 此时可以使用CayenneModeler的Reengineer工具来直接生成相关的文件.

下面将演示如何使用CayenneModeler Reengineer 来进行数据库逆向工程.

Reengineer Database Schema

  • 启动CayenneModeler, 新建一个工程 ( File > New Project )
  • 选择 Reengineer Database Schema 菜单 ( Tools > Reengineer Database Schema )
  • 点击如下图中红色箭头所示的按键, 创建一个数据源 (DataSource)

image

  • 在 “Edit Preferences” 窗口中点击 “New”, 创建一个本地数据源 (Local DataSource). 填写数据源名称 (Name), 并选择要使用的适配器 (Adapter).

若连接的是MySQL数据库, 可选择如下图所示的 “org.apache.caynne.dba.mysql.MySQLAdapter” 适配器.
本教程以MySQL数据库为例

image

  • 在 “Local DataSources” 标签页中, 填写 JDBC Driver, DB URL, User Name 和 Password, 如下图所示:

image

  • 同时注意检查如下配置:

(1) General 标签页中 File Encoding 选择 UTF-8

(2) ClassPath 标签页中, 点击 “Add Jar/Zip”, 选择数据库驱动程序 (如: mysql-connector-java-xxx.jar)

  • 点击 “Save”, 返回上一窗口, 选择刚才新建的本地数据源.

    此时可再次点击 “Saved DataSources” 后面的 “…” 按钮, 并点击弹出窗口中的 “Test” 按钮来测试数据源配置信息是否正确, 是否能成功连接数据库

  • 点击 “Continue”, 在弹出的 “Reengineer DB Schema: Select Options” 窗口 (如下图) 中可配置要映射哪些数据库表/视图. (Table Name Pattern 为 “%” 表示映射所有表/视图, 本例保留默认值, 未作更改)

image

  • 点击 “Continue”, CayenneModeler 即会根据数据库模型自动生成 Cayenne 的 DbEntity 和 objEntity. 同时, 外键关系等信息也一同被映射回来了. (展开project节点, 可看到映射结果, 如下图所示)

image

创建 DataNode

DataNode 中保存了我们的程序与特定的某一个数据库连接的信息.

  • 右键点击上图中的 “datamap” 节点, 选择 “create Data Node”, 创建一个DataNode.

  • 在出现的如下图所示的界面中配置 DataNode 信息. 其中 DataNode Configuration 中保持默认值, 主要进行JDBC Configuration的配置.

    Cayenne自带数据库连接池, 下图中 Min ConnectionsMax Connections 即分别是连接池的最小连接数与最大连接数的配置.
    image

  • 再次选择 “datamap” 节点, 并对 datamap 进行配置, 可按如下步骤操作 (参看下图):

(1) 在左侧树状视图中选中 “datamap”
(2) “DataMap Configuration” 中的 “DataNode” 选择刚才创建的DataNode
(3) “Entity Defaults” 中的 “Java Package” 填写实体类的包名 (最终生成的实体类将自动生成于此包中)
(4) 点击 “Java Package” 后的 “Update” 按钮.

image

  • 至此 CayenneModeler 中的配置即算初步完成了.

保存配置信息

  • 点击 CayenneModeler 工具栏中的保存按钮 (或选择菜单 File > Save)
  • 将配置信息保存在 Java 工程的 src 目录下 (注意保存位置应在Java工程的src根目录)

生成实体类文件

  • 选择主菜单项 Tools > Generate Classes, 生成实体类文件
  • 在弹出的如下图所示的窗口中注意检查如下内容:

(1) Output Directory 应指向 Java 工程的 src 目录
(2) Classes 标签页中选中了所示实体类

下图箭头所指的 “SuperClass Package” 处为会在 “datamap” 的 “Java Package” 设置的包名后加上 .auto, 这并非错误. Cayenne会为实体类自动创建一个父类, 此处的SuperClass Package为父类包名 ( 参看: “Cayenne入门指南” )

image

  • 点击 “Generate” 按钮即完成实体类文件的创建. (若你使用Eclipse, 则回到Eclipse, 刷新Java工程即可看到生成的配置文件和实体类文件)

好了, 现在快写一个测试程序, 测试一下Cayenne是否正常工作吧!

参看: “Cayenne入门指南”, 3.3 学习Cayenne API


PS:

  • 若数据库中表的主键为”自增长(Auto-incremented)”型, 注意在CayenneModeler中设置相应数据库对象 (DbEntity) 的 “PK Generation Strategy” 为 “Database-Generated”. 如下图:

image

  • CayenneModeler生成的实体对象 (objEntity) 并未将主键字段直接映射为 objAttribute, 若程序中需直接通过类似 user.getId() 的方式获得主键值, 可在 CayenneModeler 中手动添加主键字段的映射. 如下图:

image