现在我需要以某种自定义项目文件格式保存所有域数据。
该软件将经历多个版本,域模型总是会有所改变。我需要保持向后兼容性。我真的不知道什么是最好的方法。
我考虑过java序列化。但这似乎是很多低级别的工作,为所有模型仔细实施自定义序列化。特别是如果我考虑向后兼容性部分。
一种更好的方法似乎是使用hibernate及其注释来持久化域模型。但是我可以用这个数据库吗?我是否可以在连接数据库时遇到问题,因为它无法完全集成(无法通过localhost =>防火墙等端口进行通信)。此外,通过使用orm和数据库作为中间件来保存一些文件,无论如何似乎 little 臃肿。
总结一下:我对java相对较新,现在正在编写大规模的swing应用程序。我几乎没有序列化的经验(但我有Effective Java:D),JPA和hibernate,可用的java数据库等等。
请问有人给我一个提示吗? :)
答案 0 :(得分:1)
使用休眠是一种很好的可能性。
一些embedded database exist,因此您可以在应用程序启动之前启动它,然后再启动hibernate。
当然,优势在于,如果您希望将代码从独立转换为基于服务器,那么您的java bean-hibernate-db模型也可以在该上下文中很好地工作。序列化为您自己的格式就像创建自己的平面文件数据库,以及为什么在已经为您完成时再次编写它我还建议使用Apache Derby进行嵌入式使用(来自:Java Drinker)
对于迁移部分,最简单的方法是在数据库中创建一个版本表,告诉您当前版本是什么,然后在应用程序启动时,在数据库启动之后,但在创建会话之前factory(或实体管理器)检查当前数据库版本,检查sql迁移文件中的最后一个版本,如果两者都不匹配,则执行当前db版本之上的所有sql查询。
迁移文件可能如下所示:
-- version:1
sql query 1 (update, alter, ...)
-- version:2
sql query 2
...
编写迁移文件时必须非常小心。例如,始终考虑表中有数据(永远不要在表中添加不可为空的列,而是添加列,更新列,然后添加非无效约束)。
[edit]
如果数据库不存在或为空(例如版本表不存在),则首先创建数据库,然后开始从旧格式迁移到数据库格式。代码看起来像:读取旧数据文件,实例化hibernate / jpa实体,并持久化它们。 (你也可以编写更有效的代码来直接生成sql查询,但这需要更多的时间,并且当你的jpa模型发生变化时,维护起来会更加困难)
嵌入式数据库将在磁盘上拥有自己的文件。在不同工作站之间共享数据就足够了 如果要与其他应用程序共享数据,则需要开发导入的相反功能:从数据库加载所有需要的实体并将它们写入不同的文件格式。它可以从您的应用程序ui。
触发答案 1 :(得分:0)
如果使用DataNucleus作为JPA实现,则使用JPA可以将所有信息保存为任何JSON / XML / Excel / ODF格式(只要需要保存的数据适合持久使用JPA)。取决于数据,但列出的那些格式可能更合适。
- 安迪(DataNucleus)
答案 2 :(得分:0)
我现在正在使用XStream。 最佳点是,通过一些配置,我不需要修改我的模型 - 保存/加载只是开箱即用。
可能会使用XSLT将旧版保存文件转换为较新版本,从而完成版本控制。实际上这将是非常简单的,因为我可以保存一个旧文件,保存一个新文件,然后只为差异编写XSLT。