代码之家  ›  专栏  ›  技术社区  ›  paweloque

休眠实体:没有实体属性的列

  •  0
  • paweloque  · 技术社区  · 14 年前

    有没有一种方法可以“神奇地”持久化实体中没有表示为属性的列?具体地说,我想向一个实体添加审计信息,而不需要该实体的审计信息。审核值不存储在实体中,而是在持久化实体时从环境中检索。这发生在用户类型中。nullSafeSet从SecurityContext获取信息,而不是从实体读取。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Affe    14 年前

    拦截器API上有一个onPreparedStatement()方法,可以用来处理Hibernate的SQL。这对我来说似乎是一个很大的风险,只是为了避免在实体对象上有一个没有访问器的私有字段。在侦听器中执行一个单独的SQL可能比手动咀嚼hibernate语句要健壮得多。仅仅通过解析来确定它用作实体表的别名是什么是丑陋的,希望它不在联接中。

        2
  •  0
  •   b.roth    14 年前

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

    <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保存它。

        3
  •  0
  •   Daniel    14 年前

    您可以通过注释或在XML文件中为您的实体提供可选的INSERT和UPDATE语句(不要询问语法)。

    只需看看Hibernate最初会生成什么(->您的SQL server日志,它是一个准备好的语句),并编写一些类似的内容来填充您的审计列。

    但我相信你已经考虑过数据库中的更新触发器,只是没有使用它们,因为你想独立于数据库。。。