【问题标题】:Why does Hibernate re-implement functionality that databases already have?为什么 Hibernate 重新实现数据库已有的功能?
【发布时间】:2011-04-17 05:06:11
【问题描述】:

例如:

@Table(name = "stock", catalog = "mkyong", uniqueConstraints = {
@UniqueConstraint(columnNames = "STOCK_NAME"),
@UniqueConstraint(columnNames = "STOCK_CODE") })

@Column(name = "STOCK_NAME", unique = true, nullable = false, length = 20)

诸如“唯一”、“可空”、甚至字段长度之类的约束都是核心数据库功能。为什么在此处包含此内容?另外(尽管这可能会伤害一些人)我还敢打赌,数据库对此类约束的实现,尤其是像 Oracle 这样的主流商业数据库,可能比 OSS Hibernate 开发人员能想出的任何东西都要好。

在 Hibernate 中使用这种类型的东西是明智的,还是在数据库中放置约束等更好的做法?如果您使用这些 Hibernate 功能,您实际上是在将数据库视为文件系统,那么有什么意义呢?这个用法无处不在,但我还没有找到解释你为什么要这样做的文档。

【问题讨论】:

  • 不是 Hibernate 的“专家”,我可能会假设它正在“重新实现”这些功能(看起来确实如此),但解释为什么(而不是如何)的文档没有似乎不容易找到!

标签: java mysql database oracle hibernate


【解决方案1】:

它没有实现它们 - 它可以选择根据架构验证数据模型,或者创建它。

hibernate.hbm2ddl.auto configuration 属性允许您基于映射创建架构。

在创建 SessionFactory 时自动验证模式 DDL 或将其导出到数据库。使用 create-drop,当 SessionFactory 显式关闭时,数据库模式将被删除。

例如验证 |更新 |创建 |创建删除

如果您希望数据模型位于中心位置,而不是数据库结构,这非常有用

【讨论】:

  • 为什么hibernate不能从数据库本身获取这些信息?这就是我使用 .NET 应用程序所做的事情。
  • @siride - 如果它不存在,它将如何获取它?它根据映射定义导出架构(或确保架构符合它们)
  • 至少对于 MySQL 和 MS SQL,数据库中的表包含有关模式的信息。您可以查询这些并了解列和约束。当然,Hibernate 仍然必须知道表存在,但这比指定所有其他注释要容易得多。
  • @siride - 对不起,但你还是不明白。没有任何数据库——只有数据模型(java 类)。 hiberante 基于注释创建数据库结构。它调用“描述”,并确保数据库中存在列和约束。如果没有 - 创建它们。
  • @siride Hibernate CAN 从数据库中获取信息 IF 你决定从数据库开始。在 Bozho 描述的场景中,您从带注释的类开始。这就是问题的注释相关的地方。
【解决方案2】:

Hibernate 可以根据这些注释为您创建数据库模式。

【讨论】:

    猜你喜欢
    • 2022-11-02
    • 2011-10-13
    • 2015-11-05
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多