Hibernate:现实世界中的模式导出? - java

我很好奇我的下一个项目完全使用架构导出。我认为这是真正处理对象而非基础数据库的非常有用的方法。只需创建并注释模型,然后将其导出即可。

但是从先创建表然后创建模型对象的习惯来看,我对完全使用模式导出有疑问。这主要是因为我真的很深入休眠。但是我仍然好奇使用模式导出时,该区域列表是否会成为问题。请分享您的经验..

表之间的关系
代理/复合主键支持
当我只想从多个模型中导出一些模型时,重新导出将重新创建所有数据库。
我目前无法想到的其他人

谢谢

参考方案

我个人不喜欢导出DDL,原因如下。

数据库可能是应用程序中基础架构中最关键的部分之一,信任DDL生成以休眠意味着您必须检查由休眠生成的所有DDL以确保一切正常,检查过程非常耗时如编写DDL。
是时候发布该应用程序的新版本了,您将拥有一个现有的数据库,因此,您可能要使用alter语句,并使用一个upgrade-version-x.sql脚本来修改现有的数据库以使新数据库与新版本一起使用。此时,自动DDL生成将无济于事,因为带注释的hibernate类仅导致生成CREATE语句,而不导致ALTER DDL语句。
Hibernate / JPA注释分为两类,逻辑的和物理的。逻辑注释将是@Entity之类的东西,物理注释将是@ Table,@ Columns等之类的东西。在物理注释上定义的属性不足,无法精确地控制为SQL生成的数据库类型。例如,假设您有一个包含Date的列,并且正在使用@ Column,@ Temporal批注,通常有不止一种适合的数据库数据类型,相信冬眠选择默认值可能不是明智之举。
始终存在休眠不了解但DBA会知晓的特定于数据库的最佳实践。例如,如果要创建索引,则无法在休眠注释中指定索引,也无法指定要创建的索引类型,例如B-Tree,Bitmap ...等。如果是JPA / Hibernate注释进行了增强以允许您指定可以在数据库特定的DDL中指定的所有选项,则注释将比SQL更复杂,因为SQL是构建良好的域特定语言,并且注释永远不会像SQL DDL那样好,他们会比较罗word。您最终要做的就是在不降低复杂性的情况下转移复杂性。考虑一下您遇到的所有基于XML的配置语言,这些语言最终会越来越复杂,直到类似于一种真正的编程语言,并带有基于xml的循环,if语句,变量等。
如果应用程序不断增长并且是一个成功的商业应用程序,它具有大量数据,那么您最终将需要雇用DBA来进行调整,优化,镜像数据库...等等,DBA会了解其数据库的最佳实践,但不一定(可能)不了解Hibernate,这会使DBA的生活更加复杂。 DBA可以对数据库进行许多更改,这些更改不会影响基于休眠的Java代码,您是否真的希望DBA更改休眠代码以更改数据库设置。一旦DBA更改了数据库设置,现在您将拥有数据库的两个版本,休眠的生产版本和生产的版本,这才是真正的版本?
数据库设计最佳实践和面向对象设计最佳实践是不同的。从对象设计数据库可能意味着一个好的OO设计,但不是那么好的DB设计,先设计DB,然后再设计面向对象的Hibernate面向对象的代码可能意味着一个好的DB设计,但不是那么好的hibernate / OO设计。从哲学上讲,我更喜欢手工编写DDL以使自己处于数据库设计模式而不是OO设计模式。在一个成功的应用程序中,数据库设计可能要持续多年才能休眠。仅仅因为休眠是当今与数据库对话的唯一内容,并不意味着它将成为将来与数据库对话的唯一内容。因此,我倾向于使用数据库设计最佳实践而不是OO最佳实践来优化数据库设计。
Hibernate / ORM是泄漏的抽象,无法向开发人员隐瞒您正在处理SQL数据库的事实,如果您的开发人员不太了解SQL(他们很可能会使用SQL),请以使数据库成为数据库的方式使用休眠瓶颈。在hibernate上培训人员的个人经验告诉我,为了有效使用Hibernate,必须更好地理解SQL。您需要能够检查HQL或其他对象查询语言,并在心理上转换为SQL。您将需要知道何时可以映射关系并遍历它们(与使用报表查询相比)。您将需要了解为什么查询中的JOIN丢失是一个问题。我是ORM / Hibernate的忠实拥护者,可以有效地使用它,但是我发现许多开发人员低估了使用诸如休眠之类的ORM工具的复杂性/复杂性。
可能导致我导出Schema的唯一例外是,如果我正在编写一个废弃的原型,并且我不太了解特定于数据库的DDL。但是我还没有遇到很多突然消失的永久性原型。

这就是我反对从Hibernate批注生成DDL的原因。我希望其他人能以自己的思想和经验来理解。

eclipse插件创建休眠注释的实体? - java

我知道休眠工具可以创建休眠实体,但是休眠映射将在XML文件中,但是我想知道是否有工具可以创建休眠实体,并且映射将带有XML注释。 参考方案 编写您的Java代码并使用“源代码”>“生成Hibernate / Jpa批注”,然后Hibernate工具将尝试基于该代码添加必要的批注。

在AbstractTransactionalTestNGSpringContextTests中的hibernate和JdbcTemplate之间共享Spring事务 - java

我正在AbstractTransactionalTestNGSpringContextTests的子类中运行测试,在此我通过部分Spring上下文执行测试。每个测试都在一个事务中运行,该事务在最后回滚以使数据库保持不变。一种测试通过Hibernate写入数据库,而另一种则使用JdbcTemplate从同一数据库读取数据,并且两者共享相同的数据源。我发现通过J…

是否有任何Java框架允许开发人员在运行时创建模型? - java

我已经在spring和hibernate上工作python django了7个月了。我确实喜欢设计API的spring和hibernate。但是我想知道在Java中是否有任何框架允许开发人员仅在编写POJO类之前就创建模型而无需显式编码sql。就像django刚创建一个表并在manage.py文件上运行syncdb命令一样,它将模型文件同步到数据库表。 参考…

HIbernate创建数据库表 - java

我正在学习JPA-Hibernate。我正在关注这个article在Dog.java中,它被称为@Table(name = "dog")。 在persistence.xml中,我有以下内容<property name="hibernate.hbm2ddl.auto" value="create"…

持久对象在Hibernate体系结构中意味着什么? - java

Hibernate是一个持久性框架,用于持久化数据 从Java环境到数据库。我很困惑..如果我们将对象持久化到数据库,那么为什么Hibernate Architecture在下图中将Application和Hibernate的中间对象描述为持久性对象?(来源:viralpatel.net) 参考方案 我将使其更加清晰。持久对象是您创建的POJO类的实例,这些…