Java Hibernate是否必须驱动数据库设计?
昨天一整天我都在阅读关于Hibernate的各种文章/教程,尽管我被它的强大功能所震惊,但我对它有一个主要的担忧 似乎标准的做法是允许Hibernate为您设计/生成DB模式,这是一个新的可怕的概念,让我窒息。从我阅读的教程中,您只需将一个新实体添加到Java Hibernate是否必须驱动数据库设计?,java,hibernate,Java,Hibernate,昨天一整天我都在阅读关于Hibernate的各种文章/教程,尽管我被它的强大功能所震惊,但我对它有一个主要的担忧 似乎标准的做法是允许Hibernate为您设计/生成DB模式,这是一个新的可怕的概念,让我窒息。从我阅读的教程中,您只需将一个新实体添加到hibernate.cfg.xmlconfig文件中,用@entity注释您想要的任何POJO,瞧,hibernate就会为您创建表。虽然这很酷,但它让我想知道一些场景: 如果您已经有了一个DB模式,而Hibernate想要为您生成的模式不符合该
hibernate.cfg.xml
config文件中,用@entity
注释您想要的任何POJO,瞧,hibernate就会为您创建表。虽然这很酷,但它让我想知道一些场景:
- 如果您已经有了一个DB模式,而Hibernate想要为您生成的模式不符合该模式,该怎么办?如果您有一个疯狂的DBA拒绝在预定义(非休眠)模式上移动,该怎么办
- 如果你有参考表,里面有成千上万条记录(就像世界上所有的城市一样),会怎么样?您是否需要实例化并
数以万计的唯一POJO,或者是否有办法配置Hibernate,使其能够支持并且不会覆盖表中已有的数据save()
- 如果要对架构/表执行性能调优,该怎么办?这包括索引、规范化,以及Hibernate自动创建的内容之外的内容
- 如果要向表中添加约束或触发器,该怎么办?索引
Hibernate背后的概念是映射数据库和对象。因此它被称为ORM(对象关系映射)工具。
请阅读对象关系阻抗。
我认为您将太多的功能归因于Hibernate Hibernate确实有一个可能影响数据库实现的习惯用法 Hibernate不会为您生成模式,除非您要求它这样做。可以从现有模式开始,使用Hibernate将其映射到Java对象。但是,如果模式与Hibernate需求冲突,那么它可能是不可能的或最优的 如果DBA不让步——他们不应该这样做——或者Hibernate不能容纳您,那么您的答案是:您不能使用Hibernate 您的DBA可能会同意,但您的应用程序可能会发现Hibernate为您生成的动态SQL不是您想要的 幸运的是,这不是镇上唯一的游戏 我不认为实现必须是全部或全部。如果您使用简单的JDBC访问参考数据,有什么害处 数据库设计注意事项应独立于Hibernate。约束、触发器、规范化和索引应该由业务需求驱动,而不是由您的中间件选择驱动
如果您没有实体对象模型,或者模式无法容纳它,那么您应该重新考虑Hibernate。有直接的JDBC、存储过程、Spring JDBC和iBatis作为替代品。Hibernate提供了一种默认的将对象映射到表的方法——就像一些工具/库一样,为了简单起见,它支持约定而不是配置 但是,如果希望以不同的方式将实体映射到数据库表,可以显式地告诉Hibernate如何映射这些实体(从更改表名等简单属性,到重新定义相关实体之间的外键关系以及如何持久化) 如果正确地执行此操作,则不需要实例化和保存现有数据,因为这将是毫无意义的—数据库已经以Hibernate完全理解的形式包含了有关实体的信息。(想想看——加载然后立即保存一个实体应该始终是禁止操作的,因此可以完全跳过。)
所以对你的问题的简短回答是“不”。如果不喜欢设计表,可以让Hibernate采用合理的默认值。但是,如果您确实想明确地设计模式,您可以这样做,然后将确切的模式描述给Hibernate。这是quick'n dirty原型或简单教程的首选方式,但它远不是任何生产应用程序的首选方式。我更喜欢独立设计数据库,使用脚本生成模式、表、视图、索引等,并将模式映射到实体 只要映射在数据库中找到表和列,一切都正常 一旦数据库中有数据并且模式必须更改,就必须编写迁移脚本。你不能放弃一切,从头开始。本教程是为从Hibernate开始的开发人员编写的,他们必须尽快发现Hibernate,而不必处理复杂的SQL脚本。
- 如果您已经有了一个数据库模式
- 如果你有参考表
- 如果要执行性能调整,该怎么办
- 如果要向表中添加约束或触发器,该怎么办?我