hibernate属性既可以是持久的,也可以是计算的



假设我有一个具有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"部分应该使属性可更新。

那么,有人能告诉我们,有没有一种正确的方法可以使该属性同时具有计算性和持久性?

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

已在此处讨论

相关内容

最新更新