【问题标题】:Can hibernate property be both persistent and calculated?hibernate 属性可以是持久的和计算的吗?
【发布时间】:2015-02-25 13:35:36
【问题描述】:

假设我有一个具有dateOfBirthyearOfBirth 属性的Person 类,持久保存在Postge 数据库中。 我需要映射yearOfBirth 条件:如果设置了dateOfBirth,则从中提取年份,否则使用yearOfBirth 值。

我尝试使用这样的映射:

<property name="dateOfBirth" type="timestamp" >
    <column name="date_of_birth" />
</property>

<property name="yearOfBirth" type="integer" formula="(
              CASE
                WHEN dateofbirth is NULL THEN year_of_birth
                ELSE TO_NUMBER(TO_CHAR(dateofbirth, 'YYYY'), 'FM9999')
              END
              )" generated="always">
        <column name="year_of_birth"/>
</property>

但它给了我 PSQLException:ERROR: column coreemploy0_.year_of_birth does not exist。但是表中肯定存在列year_of_birth

不仅如此,我还尝试使用简化映射:

<property name="yearOfBirth" type="integer" formula="(
               TO_NUMBER(TO_CHAR(dateofbirth, 'YYYY'), 'FM9999')
              )" generated="always">
        <column name="year_of_birth"/>
</property>

它给了我正确的输出,但更新实体后我的数据库中的列仍然为空。我认为generated="always" 部分应该使属性可更新。

那么,谁能告诉我,有没有一种正确的方法可以使该属性既计算又持久?

【问题讨论】:

    标签: hibernate postgresql hibernate-mapping


    【解决方案1】:

    计算属性没有自己的列映射。

    已经讨论过here

    【讨论】:

    • 那么您如何看待创建附加字段来存储年份,例如persistedYearOfBirth,是解决此任务的正确方法吗?或者也许有更好的方法?
    • 你可以试试。但是真的需要将它存储在数据库中吗?考虑一下,因为这个计算属性的持久化可能相当昂贵。这可能会损害您的表现。
    • 感谢您的回答。不幸的是,我必须存储出生年份和出生日期(因为并非所有用户都愿意提供确切的出生日期)。因此,我不知何故需要保留一年的属性(为用户提供输入它的机会)并计算属性 - 用于输出和查询操作。
    猜你喜欢
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2013-01-27
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 2012-12-19
    相关资源
    最近更新 更多