没有数据库映射的对象持久性

时间:2017-12-11 14:53:22

标签: java jpa orm nosql

我正在寻找关于持久化Java对象而不需要数据库映射的建议。在简单(和愚蠢)的单词中,我想拥有JPA,但不要被数据库结构的细节所困扰:表,列,键。理想情况下,我想要实现的只是定义Java类,实例化对象以及持久化/检索这些对象及其关联,而无需在其他任何地方重复实体/属性信息。我知道有各种各样的NOSQL数据库,文档数据库,键值存储等等,但是除了RDBMS之外的任何东西,我只有阅读Cassandra,BerkeleyDB的描述和手册,我的经验几乎为零。 MongoDB等我甚至无法判断它们是否支持我的用例;(所以这是我的要求:

  • 我将使用Java编程语言,所以如果它会很好 有一些带有API的JAR可以访问数据库
  • 我的主要目标是避免定义一个对象到表的映射,因为我认为它是多余的,我认为类型定义是持久性的唯一必要的元数据源。任何更多的东西,可能除了一些微调属性(转换器,瞬态字段等)。所以,如果有一些基于JPA / RDBMS的解​​决方案,让我完全避免触及数据库架构,我接受它。
  • 我的应用程序中的对象图将具有许多关系,将没有逻辑顶级对象将其他子对象聚合为完全包含的属性。相反,我的模型包含相当多的顶级类,它们或多或少会被具有一对多和多对多关联的其他类型直接引用。出于这个原因,我猜测半结构化,基于文档和基于JSON的存储(CouchDB,MongoDB)不能满足我的需求,因为我找不到轻松表达关系的方式在聚合之外的对象(即文档)之间。或者我错了。
  • 持久化对象的数量将达到平均水平,即不需要特定的大规模可扩展性,大数据功能等。我估计一些对象数十万
  • 我需要存储是事务性的,提交成功/回滚错误机制或等效。
  • 架构演变不应要求对底层存储架构进行任何操作。因此,当我的模型发生变化时,我想要做的就是检索对象,修改/重新计算属性以及存储修改后的对象。无需更改任何表格,列等。
  • 我需要根据对象属性执行一些查询。不是很复杂的,只有常规的关系运算符,但可能有连接(FROM Book b WHERE b.price < :allowedPrice AND b.author=:author)。
  • 因为它将用于我的业余爱好,最终成为商业化的项目,我希望它可以免费用于商业用途(理想情况下),或者使用一些非限制性许可只要它停留在非工作时间(这可能是年龄)。

实际上根据我的阅读,似乎某些对象数据库对我来说是最好的选择,例如DB4O或ObjectDB。不幸的是,DB4O已经死了,对于我来说,ObjectDB的许可似乎有点过于苛刻。也许我不知道有什么可能性来满足上面的要求与其他东西,一些NoSQL解决方案或一些工具在常规&#39;之上。 RDBMS。

您有任何建议或意见吗?

1 个答案:

答案 0 :(得分:0)

我决定主要关注对象数据库解决方案,不幸的是我找不到很多。我评估了ObjectDB,我不得不承认它是我碰巧使用的最好的持久性解决方案。

优点:

  • 它支持JPA和JDO API,因此使用OBjectDB就像使用任何基于ORM的解决方案一样简单。如果您了解JPA或JDO,那么从ObjectDB开始就没有入门成本。如果您坚持一些非常基本的指导原则,您可以随意切换ObjectDB和ORM,只需更改连接字符串和部署的JAR即可。
  • ObjectDB几乎不执行任何持久性库所做的事情:它让您专注于持久性任务,而不会产生任何干扰和不便,从而导致底层存储。您只需将模型定义为实体类,并且您不需要重复自己并处理任何表,列,ORM(orm.xml,消失!),数据库模式演变,在模式更新的列之间移动数据...
  • ObjectDB比JPA ORM有更宽松的要求。您可以持久保存几乎任何类型的对象(GUID,新的日期和时间API!),您需要更少的注释(例如,关系注释,即@OneToMany@ManyToMany和其他类型)不是必需的。但是,如果需要ObjectDB和JPA ORM之间的源兼容性,则仍需要它们。

缺点:

  • 它是商业产品,因此需要您获得许可。可以免费使用ObjectDB(商业或非商业),但最多只能使用10个实体类。有时可能会获得免费的,无限制的许可用于评估目的 - 或者至少在ObjectDB页面上曾经有过这样的信息,但我不知道它现在是否可能 - 我没有问过。
  • 虽然JPA似乎几乎完全受支持,但静态元模型API却没有。没有静态元模型生成器,即使您手动创建它,带有元模型参数的标准API方法也会抛出 Not Supported 异常。如果您计划从现有解决方案(例如,Hibernate)切换到ObjectDB,这可能是一个障碍。希望将来某些时候可以添加对静态元模型的支持。

对我来说,ObjectDB似乎完全我需要的东西,我将进一步评估它,以检查其他方面,如性能,与JPA更隐蔽的角落的一致性以及使用ORM轻松替换的可能性需要时,模式演变等。