【问题标题】:Difference between attribute name, logical name and physical name in hibernatehibernate中属性名、逻辑名和物理名的区别
【发布时间】:2018-02-22 08:00:43
【问题描述】:

我是 hibernate 新手,很难理解 hibernate 中逻辑名称的用途是什么?我读过这个http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#PhysicalNamingStrategy

我没看懂类属性名、逻辑名和物理名的区别。 我知道物理名称是db中的名称,属性名称当然是java类属性名称。但是逻辑名称的作用是什么?为什么现在有 2 个阶段称为 ImplicitNamingStrategy 和 PhysicalNamingStrategy?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    有 2 个阶段的想法是分离关注点或责任......让您更加灵活......示例:假设您在一个大型项目中,并且有 2 个团队,一个负责数据库设计(包括命名),另一个用于对象建模......数据库团队总是在他们的命名标准中进行更改(无论出于何种原因),但是,他们负责实施物理名称策略,并且他们将逻辑命名为合同名称应该是小写蛇(例如:dummy_attribute)...如果休眠不允许您定义逻辑命名策略,那么您也必须以小写蛇命名您的类属性...这就是两个阶段的原因

    【讨论】:

    • 感谢 Carlitos,这正是我所需要的。另一个问题,我想知道隐式命名策略的默认行为。是否将骆驼格属性名称更改为小蛇格?文档说默认的隐式策略是 ImplicitNamingStrategyJpaCompliantImpl ,但我想知道 ImplicitNamingStrategyJpaCompliantImpl 的行为。
    • 我不太确定这个,因为我总是明确地命名我的实体和属性(分别使用@Table@Column)......但是,我认为 ImplicitNamingStrategyJpaCompliantImpl 使用基于此 SO thread 的 JAVA 类/属性命名约定...您必须使用提供的配置才能真正确定...
    【解决方案2】:

    逻辑名称在您的 java/hiberate 配置中定义。 物理名称是数据库中的名称。 根据官方文档中的命名策略部分:http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#naming]

    对象模型到关系数据库的部分映射是将对象模型的名称映射到相应的数据库名称。 Hibernate 将其视为 2 阶段过程:

    第一阶段是从域模型映射中确定正确的逻辑名称。逻辑名称可以由用户显式指定(例如使用@Column 或@Table),也可以由 Hiernate 通过 ImplicitNamingStrategy 合约隐式确定。

    其次是将此逻辑名称解析为由 PhysicalNamingStrategy 合同定义的物理名称。

    【讨论】:

    • 如果我提到了文档的链接,那意味着我已经阅读了它。告诉我你为什么需要逻辑名称?
    • 当然。 JPA 没有定义逻辑名称和物理名称之间的区别。但是,如果您希望围绕数据库对象的命名定义规则,则可以覆盖 PhysicalNamingStrategyStandardImpl.toPhysicalTableName(Identifier name, JdbcEnvironment context)。这允许命名规则的实现,而不必对它们进行硬编码。希望对您有所帮助。
    • Noooooooooooooo
    • 逻辑名称是您代码/休眠配置中的名称。您可以选择将其保留为物理名称或使用命名策略为您的物理名称定义规则。请具体说明不清楚的地方。
    • Imen,感谢您的宝贵时间。但我想知道为什么我们需要逻辑名称?卡利托斯回答了它。
    猜你喜欢
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 2015-10-14
    • 2021-05-19
    • 1970-01-01
    相关资源
    最近更新 更多