当前位置:Java -> 介绍 Stalactite ORM
Java ORM世界非常稳定,存在一些库,但在过去的十年中没有任何变革。与此同时,应用程序架构随着一些趋势的发展,如蜂窝结构、CQRS、领域驱动设计或领域纯度。Stalactite试图更适合这些新模式,它允许持久化任何类型的类,而无需对其进行注释或使用外部XML文件:其映射是由方法引用构成。
作为一个好处,您可以通过使用
MappingEase.entityBuilder(Country.class, Long.class)
.mapKey(Country::getId, IdentifierPolicy.afterInsert())
.mapOneToOne(Country::getCapital, MappingEase.entityBuilder(City.class, Long.class)
.mapKey(City::getId, IdentifierPolicy.afterInsert())
.map(City::getName))
版本2.0.0已经发布几周,并且可以作为Maven依赖项使用,下面是一个使用HSQLDB的例子。目前,Stalactite与以下数据库兼容(主要是它们的最新版本):HSQLDB、H2、PostgreSQL、MySQL和MariaDB。
<dependency>
<groupId>org.codefilarete.stalactite</groupId>
<artifactId>orm-hsqldb-adapter</artifactId>
<version>2.0.0</version>
</dependency>
如果您对不太专注于数据库供应商的模块感兴趣,您可以使用orm-all-adapter模块。只要注意它会给您带来额外的模块和额外的JDBC驱动程序,增加您的构件。
在获取Statactite作为依赖项后,下一步是拥有一个JDBC数据源并将其传递给org.codefilarete.stalactite.engine.PersistenceContext
:
org.hsqldb.jdbc.JDBCDataSource dataSource= new org.hsqldb.jdbc.JDBCDataSource();
dataSource.setUrl("jdbc:hsqldb:mem:test");
dataSource.setUser("sa");
dataSource.setPassword("");
PersistenceContext persistenceContext = new PersistenceContext(dataSource, new HSQLDBDialect());
然后来到有趣的部分:映射。假设您获取一个Country,可以通过流畅的API快速设置其映射,从org.codefilarete.stalactite.mapping.MappingEase
类开始:
EntityPersister<Country, Long> countryPersister = MappingEase.entityBuilder(Country.class, Long.class)
.mapKey(Country::getId, IdentifierPolicy.afterInsert())
.map(Country::getName)
.build(persistenceContext);
afterInsert()
标识策略意味着country.id列是自增的。还存在另外两种策略:beforeInsert()
用于由数据库序列(例如)给出的标识符,alreadyAssigned()
用于具有由业务规则给定的自然标识符的实体,模式可以用如下org.codefilarete.stalactite.sql.ddl.DDLDeployer
类来生成(会将其生成到PersistenceContext
数据源):
DDLDeployer ddlDeployer = new DDLDeployer(persistenceContext);
ddlDeployer.deployDDL();
最后,您可以通过先前获取的EntityPersister
来持久化您的实体,请查看下面的例子。您可能注意到在Stalactite持久化器中找不到JPA方法。原因是Stalactite与JPA大不相同,也没有旨在与之兼容:没有注释、没有附加/分离机制、没有一级缓存、没有延迟加载以及许多其他特性。因此,这些方法都很直接实现它们的目标:
Country myCountry = new Country();
myCountry.setName("myCountry");
countryPersister.insert(myCountry);
myCountry.setName("myCountry with a different name");
countryPersister.update(myCountry);
Country loadedCountry = countryPersister.select(myCountry.getId());
countryPersister.delete(loadedCountry);
Stalactite的原始用法已经介绍了,与此同时,您可能对其与Spring的集成感兴趣,以便从其@Repository
的魔力中受益。Stalactite提供了这个功能,只需注意它仍然是一个正在进行中的功能。激活它的方法与激活JPA的方法相同:通过在Spring应用程序中使用@EnableStalactiteRepositories
注释来启用Stalactite库。然后您将声明PersistenceContext
和EntityPersister
为@Bean
:
@Bean
public PersistenceContext persistenceContext(DataSource dataSource) {
return new PersistenceContext(dataSource);
}
@Bean
public EntityPersister<Country, Long> countryPersister(PersistenceContext persistenceContext) {
return MappingEase.entityBuilder(Country.class, long.class)
.mapKey(Country::getId, IdentifierPolicy.afterInsert())
.map(Country::getName)
.build(persistenceContext);
}
然后,您可以将您的存储库声明如下,以便注入到您的服务中:
@Repository
public interface CountryStalactiteRepository extends StalactiteRepository<Country, Long> {
}
正如先前提到的,因为Stalactite的范式不同于JPA(没有注释、没有附加/分离机制等),您在Stalactite中不会找到JPA存储库的相同方法:
save
:保存给定的实体,根据其持久状态进行插入或更新saveAll
:与前一个方法相同,具有庞大的APIfindById
:尝试在数据库中通过其ID查找实体findAllById
:与前一个方法相同,具有庞大的APIdelete
:从数据库中删除给定的实体deleteAll
:与前一个方法相同,具有庞大的API在这些章节中,我们介绍了Stalactite ORM,有关配置、映射以及所有文档的更多信息都可以在网站上找到。
该项目是在MIT许可下的开源项目,并通过Github共享。
感谢阅读,欢迎任何反馈!
推荐阅读: 13.连续正整数之和为1000 的共有几组?
本文链接: 介绍 Stalactite ORM