【问题标题】:Annotation free spring data solution无注释弹簧数据解决方案
【发布时间】:2016-12-05 21:33:32
【问题描述】:

现在似乎每个人都使用注释来持久化数据。

为什么会出现这个问题?
持久性注释特定于所选持久性 API。如果使用 MySQL,则使用 @Entity;如果使用 Couchbase,则必须使用 @Document。

在较大的项目中,通常有一个 API 层用于对对象进行建模。该层具有或至少不应该具有对任何特定于数据库的任何依赖项。

public class User implements IUser {
    private String email;
    private String id;
    private String password;
    private String username;

所以这里不能使用@Document。

数据库/持久层目前只有这个spring-data repository

public interface IUserRepository extends CrudRepository<IUser, String> {}

和配置类

@Configuration
@EnableCouchbaseRepositories
class CouchbaseConfiguration extends AbstractCouchbaseConfiguration {

我希望能找到一个基于 XML 的配置示例,但什么也没有,到处都是注释。
我该如何解决这个问题?
是否有基于 XML 的对象映射方法?
如果不是,如何在不污染 API 层的情况下解决这个问题?

【问题讨论】:

  • 这听起来更像是一个通用的spring-data 问题,因为问题与spring-data-jpa 等其他商店实现相同,对吧?
  • 是的,这个问题也会影响其他实现。例如,如果可以使用 Hibernate,对于 SQL 数据库,可以使用 xml 进行建模,而无需 API 层中的注释...

标签: java orm spring-data-couchbase


【解决方案1】:

没有基于 XML 的方法。如果你需要保持你的 API 层完全干净,你仍然需要使用一个具体的后备存储并在某个时候选择一种技术......所以这表明你必须在 API DTO 和 Spring Data 持久化之间添加一个层(实体)。

请注意,Spring Data 根据存储对数据模型应用不同的约定。对于 Couchbase,@Document 注释不需要,除非您想处理 expiry/TTL。 也就是说,@Id 注释仍然是强制性的(来自 SDK 或 Spring Data Commons,我会在你的情况下推荐)...

还要注意,注解是声明。如果没有将数据存储用于带注释的类型,它们不会启动任何操作。

如果您遵循所有约定(特别是在实体 POJO 中将 id 字段命名为 id 或 _id),Spring Data Mongo 似乎可以在没有任何注释的情况下进行管理,因此也许可以将 Spring Data Couchbase 修改为默认为如果没有找到 id 注释,这样的 id 约定? (那里有很好的公关潜力;-)

【讨论】:

  • 我再次同意,注释只是声明性的,但它们添加了在某些时候可能不需要的依赖项。您很快就会遇到这样的情况,即您拥有用于持久性的注释以及用于 JSON 的注释等等......如果您可以使用 XML 或混合注释或良好的默认值配置映射,我认为您不需要在 API 和持久性之间增加一层你建议的。这一切都可以在持久层中完成……
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 2011-01-02
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多