当前位置:Java -> 介绍 Stalactite ORM

介绍 Stalactite ORM

Java ORM世界非常稳定,存在一些库,但在过去的十年中没有任何变革。与此同时,应用程序架构随着一些趋势的发展,如蜂窝结构、CQRS、领域驱动设计或领域纯度。Stalactite试图更适合这些新模式,它允许持久化任何类型的类,而无需对其进行注释或使用外部XML文件:其映射是由方法引用构成。

作为一个好处,您可以通过使用流畅API来使您的实体关系链,而不是在实体上到处散布注释,您将得到对实体图的更好视图。这对于查看实体图的复杂性非常有帮助,这将影响其加载以及内存。此外,由于Stalactite只会急切获取数据,因此我们可以说你看到的就是你得到的。以下是一个非常简单的例子:

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()用于具有由业务规则给定的自然标识符的实体,
  • 任何未声明的属性都被视为瞬时的,不受Stalactite的管理。

模式可以用如下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);


Spring集成

Stalactite的原始用法已经介绍了,与此同时,您可能对其与Spring的集成感兴趣,以便从其@Repository的魔力中受益。Stalactite提供了这个功能,只需注意它仍然是一个正在进行中的功能。激活它的方法与激活JPA的方法相同:通过在Spring应用程序中使用@EnableStalactiteRepositories注释来启用Stalactite库。然后您将声明PersistenceContextEntityPersister@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:与前一个方法相同,具有庞大的API
  • findById:尝试在数据库中通过其ID查找实体
  • findAllById:与前一个方法相同,具有庞大的API
  • delete:从数据库中删除给定的实体
  • deleteAll:与前一个方法相同,具有庞大的API

结论

在这些章节中,我们介绍了Stalactite ORM,有关配置、映射以及所有文档的更多信息都可以在网站上找到。

该项目是在MIT许可下的开源项目,并通过Github共享。

感谢阅读,欢迎任何反馈!

推荐阅读: 13.连续正整数之和为1000 的共有几组?

本文链接: 介绍 Stalactite ORM