JPA:我应该从表生成实体还是从实体生成表?

问题描述:

总之,我工作的一个新的项目比较大的一个......许多表,许多协会,inheretence ....(到目前为止我创建了UML & MCD)JPA:我应该从表生成实体还是从实体生成表?

我想知道什么是从这一步开始的最佳方式:我应该手动创建数据库,然后使用JPA生成实体,还是应该先手动创建实体,然后生成我的数据库?什么是最好的办法做到这一点,以便我可以避免更大的问题...

+0

其产生DB liquibase脚本,然后生成从DB – ByeBye

+0

实体,我决定去与从实体生成数据库,它更有SENS现在对我,因为我没有使用任何存储过程或类似的事情......除了我我没有为我的应用程序创建表格。请参阅已接受的答案以获取更多关于我为什么决定参加此次审核的信息。谢谢@ByeBye – cimecut

+0

我不会让JPA管理我的数据库结构,因为它的所有标准选项会破坏您的数据。无论是从表格生成实体还是手动生成实体,这都是一个偏好问题。 – coladict

这取决于:-)。

  • 如果您的应用程序“拥有”数据库(是唯一的用户),将数据库视为实现细节并让JPA创建它通常是有意义的。这样,您不必惹SQL,并且数据库始终匹配JPA期望的内容。如Essex Boy的答案所述,这对于测试等场景也很有用。
  • 如果数据库已经存在,或者打算与其他应用程序共享,那么您的选择已经完成 - 您必须使用那里的内容(并小心改变它)。
  • 数据库结构可能存在外部约束。也许您必须使用存储过程,或者使用特定的数据库命名约定,或者在实施约束的更新期间使用工具进行模式迁移。在这种情况下,您需要详细控制数据库结构,这通常意味着您必须使用SQL自己创建它。

因此,检查你正在工作的约束,然后决定。

+0

谢谢!我决定去根据你的答案从实体生成数据库。 – cimecut

我强烈建议你让实体生成表。

这也将有助于测试和开发,例如,您可以使用为每个测试构建和拆卸的H2数据库。

我甚至不看数据库,直到一个项目合理进展。

JPA实体可以在没有任何表或列名的情况下开始生活,随着项目的进步,列和表名可以同意,而不会对其余代码产生任何影响。

在最后的集成阶段细微的变化可以到实体JPA注解制成允许用于Oracle,DB2等特定数据类型的异常

应用程序应该负责自己的数据库。这对于一个新项目尤其重要。

+0

“应用程序应负责他们自己的数据库。”虽然一个可行的观点,这是不是每个人都同意。很长时间以来,数据库被认为是多种应用程序互操作的好方法。现在可能正在改变,例如微服务应该有自己的“数据库”,但绝不是每个人都同意的。 – sleske

+0

我相信很多人会不同意,这是我的看法。这个问题意味着没有现有的数据库。存储过程在很多方面都很糟糕(在我看来),命名约定可以通过JPA注释来满足。应该使用Liquibase而不是SQL来进行更改。 –

+0

够清楚!谢谢 !这也有助于避免编辑我的实体,以防在创建我的分区时出错... – cimecut

模式生成(由ORM层完成)是一种便利的功能,但是生成的模式应该在每一种情况下都由数据库(DBA)坚定的人员在生产之前进行验证。即使首先创建模式,然后创建适当的ORM映射,也是更高性能/可靠的方式。

+0

真的,我应该给该数据库创建代码(我将在以后产生以来我已经决定要生成的entites DB)到应用投产前的DBA ...它通常会这样的,大中旬范围内的公司 – cimecut

来自实体或来自实体的表格。切勿从数据模型创建对象模型。始终从域分析中创建对象模型。 JPA是而不是这是一个数据操作工具,它是一个对象操作工具。

如果您不掌握数据库模式,那么您只需要希望它支持对象模型,并找出如何将对象模型映射到关系模型。这就是为什么它被称为对象到关系映射(ORM),而不是关系到对象映射。

绝不会让数据模型驱动您的对象模型。

+0

我从来没有想过这样!这实际上使sens,很多。 我会接受这个答案,如果它使每个用户(初学者也),以帮助未来的SO访问者敏感。 – cimecut

+0

“从不”是一个强有力的陈述......但我同意这种精神:不要让你的思维受到现有数据库模式的影响。 – sleske

+0

如果你能想到一个反例... –