【问题标题】:Configuring Hibernate to play nice with existing DB constraints?配置 Hibernate 以适应现有的数据库约束?
【发布时间】:2013-07-25 02:06:48
【问题描述】:

在过去的几天里,我卷起袖子第一次开始使用 Hibernate。得知 Hibernate 的默认行为实际上是驱动数据库本身的 DDL,我感到非常惊讶:

<property name="hbm2ddl.auto">create</property>
    or
<property name="hbm2ddl.auto">update</property>

这与我习惯的相反,我习惯由某人(通常是 DBA)创建数据库结构:模式、表、键约束、索引、触发器等;然后我(开发人员)编写我的应用程序以遵守这些限制。

这引发了一些类似的相关问题:

  1. 如何与基于 Hibernate 的应用程序一起创建/维护索引?选择你最喜欢的关系数据库——MySQL、Postgres、Oracle 等等。您是通过 Hibernate 指定索引(如果是,如何指定),还是必须在 DB 中指定它们(如果是,如何让 Hibernate 尊重这些索引而不覆盖它们)?
  2. 与上述 #1 的问题相同,但使用多列键而不是索引。
  3. 如何在 Hibernate 中指定列顺序?它只是基于实体内Java字段的顺序吗? Hibernate 添加的列(例如在进行连接或实现继承策略时)呢?
  4. 如果我在 Hibernate 创建的表上手动安装触发器,如何防止 Hibernate 覆盖/删除它?
  5. 如何指定创建 Hibernate 表的数据库/模式?

提前致谢!

【问题讨论】:

    标签: java hibernate jpa indexing ddl


    【解决方案1】:
    1. 您可以在实体字段上使用@Index 注释
    2. 请看这个问题/答案:How to define index by several columns in hibernate entity?
    3. 是的,它只是基于实体中 Java 字段的顺序
    4. 您可以将 hbm2ddl.auto 设置为“验证”,使其仅验证您的架构,而不进行任何更新。
    5. 您可以使用@Table(name = "..") 注解为您的实体/表指定自定义名称

    【讨论】:

    • 感谢@gerrytan (+1) - 对上述 #5 的后续跟进 - 假设我必须使用数据库/模式:loggingusers,并且我想向users 称为security_events 的数据库/模式。我会使用@Table(name="users.security_events") 吗?或者是其他东西?再次感谢!
    • 使用@Table(name="security_events", schema="users")
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2011-01-26
    相关资源
    最近更新 更多