Hibernate实体:没有实体属性的列

时间:2010-05-05 15:48:25

标签: java hibernate persistence

有没有办法“神奇地”持久保存未在实体中表示为属性的列?具体而言,我想在没有实体审计信息的情况下向实体添加审计信息。审计值不存储在实体中,而是在持久化实体时从环境中检索。这发生在AuditInfoUserType中。 nullSafeSet从SecurityContext获取信息,而不是从实体读取。

但是,在hibernate映射中,必须定义审计信息属性。

在hibernate中有没有办法定义没有属性的列?

3 个答案:

答案 0 :(得分:1)

拦截器API上有一个onPreparedStatement()方法,可以用来搞乱Hibernate的SQL。这对我来说似乎有很大的风险,只是为了避免在你的Entity对象上隐藏一个没有访问器的私有字段。在侦听器中执行单独的SQL可能比尝试手动munge hibernate的语句更强大。只是通过解析来弄清楚它用作实体表的别名是多么丑陋,并希望它不在连接中。

答案 1 :(得分:0)

我会将审计信息映射指定为实际实体的一个组件,例如:

<class name="EntityName" table="TABLE_NAME">

        <property name="name" column="NAME" not-null="true"/>

        <component name="auditInfo">
            <property name="ipAddress" column="IP_ADDRESS"/>
        </component>        
</class>

但很明显,您需要在auditInfo类中创建一个字段EntityName,以便在准备好设置时保存审核信息。

如果你真的不想在课堂中包含auditInfo,我想你需要用SQL保存它。

答案 2 :(得分:0)

您可以通过Annotations或XML文件为您的实体提供替代INSERT和UPDATE语句(不要问我语法)。

看看Hibernate最初会生成什么( - &gt; SQL服务器的日志,它是一个准备好的语句),并编写类似的内容,这些内容另外填满了你的审计列。

但我相信你已经在数据库中考虑了ON UPDATE触发器而只是没有使用它们,因为你想要独立于数据库......