简介
笔者在寻找一个轻量级 ORM 工具的时候, chat gpt 告诉笔者 ebean 是比较轻量的, 所以笔者就尝试了一下ebean 这个库。
体验下来感觉使用上是比较方便的,但是配置起来则比较令人头大, 所以写一篇博文记录一下相关内容。
主要内容
单模块项目使用ebean
一些链接:
以下是一些基本信息:
- 项目基于Maven 进行配置。
- 使用Mysql 数据库。 如果使用别的数据库也只是需要修改一些依赖项就可以了。
- 除了引用依赖之外, 还需要使用maven 插件。
Maven 依赖库:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<!-- https://mvnrepository.com/artifact/jakarta.persistence/jakarta.persistence-api -->
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>${jakarta.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.ebean/ebean -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>${ebean.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.ebean/ebean-platform-mysql -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-mysql</artifactId>
<version>${ebean.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.ebean/ebean-querybean -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>${ebean.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-agent</artifactId>
<version>${ebean.version}</version>
</dependency>
|
ebean.version
变量用于指定ebean的版本, 示例值为: 15.1.0
- ebean 使用了JPA的注解来标记实体类, 比如
@Entity, @Id, ...
ebean-platform-mysql
是表示操作mysql数据库的, 如果是其他数据库则使用其他的版本
ebean-querybean
是关于Bean的附属类型 QBean
的支持, 主要是用于查询的。
ebean-agent
是修改Bean的字节码的, 实现一些字节码增强技术。
Maven 插件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<!-- generate ebean query beans -->
<groupId>io.ebean</groupId>
<artifactId>querybean-generator</artifactId>
<version>${ebean.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<?m2e execute onConfiguration,onIncremental?>
<plugin>
<!-- perform ebean enhancement -->
<groupId>io.ebean</groupId>
<artifactId>ebean-maven-plugin</artifactId>
<version>${ebean.version}</version>
<extensions>true</extensions>
<executions>
<execution>
<?m2e execute onConfiguration,onIncremental?>
<id>enhance</id>
<phase>process-classes</phase>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
|
- 如果项目中没有使用lombok, 则可以去掉相关的部分。
- 插件顺序换位可能会产生一些问题。
querybean-generator
是用于自动生成 QBean
代码使用的。
ebean-maven-plugin
是用于编译之后自动做字节码增强使用的。
如果是单模块项目的话, 有了上面的配置文件内容之后就可以认为差不多算是配置好了。
以下代码部分是手写, 部分是从官网或者其他网站上复制而来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
@Data
@MappedSuperclass
public abstract class BaseModel {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
protected Long id;
@Version
protected Long version;
@WhenCreated
protected Instant createdTime;
@WhenModified
protected Instant modifiedTime;
}
@Data
public class Order extends BaseModel{
private long buyer;
private long goodsId;
private int status = 0;
}
public class Test {
private Database database;
public void setup() {
// datasource
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUsername("root");
dataSourceConfig.setPassword("123456");
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mydb");
// configuration ...
DatabaseConfig config = new DatabaseConfig();
config.setDataSourceConfig(dataSourceConfig);
// create database instance
database = DatabaseFactory.create(config);
}
public void testSave(){
Order o = new Order();
o.setBuyer(1);
o.setGoodsId(15001);
o.setStatus(0);
database.save(o);
}
public void testUpdate(){
List<Order> orders = new QOrder().goodsId.equalTo(15001).findList();
for( Order o : orders) {
if(o.getStatus() == 0) {
o.setStatus(100);
database.save(o); // 或者循环结束之后, 使用saveAll, 这里的代码仅做示意作用。
}
}
}
}
|
Version, WhenCreated, WhenModified
由ebean 自行维护, 表示版本号, 创建时间, 最后的修改时间
QOrder
是基于Order
生成的, 是插件querybean-generator
进行生成的。
- 除了
save
还可以考虑显式的调用insert/update
方法
有了上面的代码, 就可以考虑运行程序了。 但是运行的话, 需要点辅助装置。 读者有2个选项, 一个是安装插件(idea, eclipse), 或者添加jvm参数(任何编辑器都可用)
- 在 https://ebean.io/docs/getting-started/ 页面里面找到IDE Plugin 部分,然后Install 以下就可以了。
- 手动添加jvm参数的话, 需要先将
ebean-agent
的jar 复制到项目路径, 随后在启动配置中添加jvm 参数 -javaagent:${ebean-agent-jar-path}
即可。
ebean-agent
的jar文件可以在 本地的.m2 目录里面找到。 路径应该是 XXXXX/.m2/io/ebean/ebean-agent/xxx.jar
- vs code 添加jvm参数需要修改
launch.json
配置文件,添加内容: "vmArgs": "-javaagent:${ebean-agent-jar-path}"
- idea 需要在
VM options
那一栏里添加, 新版本这个选项默认隐藏了, 需要打开一下。
问题处理
Q: java.lang.IllegalStateException: Bean class _ is not enhanced?
因为 ebean-agent 没配置好, 编辑器下应该是插件问题, 或者 JVM参数没指定好。
Q: NullPointerException using Query beans
基本上问题是同上 。
多模块项目中使用ebean
如果读者的多模块项目都使用ebean 库作为ORM工具, 那么相关配置直接配置到父模块即可。 但是如果读者的一个子模块不需要使用ebean, 比如是spring boot 项目, 那么需要使用下面的方式进行配置。
- 将插件放到父模块的
build/pluginManagement/plugins
节点下面
- 在每个需要启用插件的 子模块上将插件放到
build/plugins
节点下面, 只需要 groupId, artifactId
这两个属性即可。 其他属性都会从父模块上继承。
- bean模块和 调用 bean 的模块都需要添加上面的插件。
打包
在VS Code 开启过程中打包的话, 可能会出现一些问题,因为VS Code 的Java插件,Maven插件也会对源代码进行编译, 但是在编译的时候,他们是不应用ebean-maven-plugin 的, 所以如果在VS Code 开启的时候执行mvn clean package
,打出来的包可能是无法使用的。
关闭VS Code 即可解决这个问题。
总结
ebean 的配置确实繁琐了一些。。 但是它也有它自己的优点。