有没有办法“神奇地”持久保存未在实体中表示为属性的列?具体而言,我想在没有实体审计信息的情况下向实体添加审计信息。审计值不存储在实体中,而是在持久化实体时从环境中检索。这发生在AuditInfoUserType中。 nullSafeSet从SecurityContext获取信息,而不是从实体读取。
但是,在hibernate映射中,必须定义审计信息属性。
在hibernate中有没有办法定义没有属性的列?
答案 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触发器而只是没有使用它们,因为你想要独立于数据库......