2

我正在使用休眠注释、spring、sessionFactory 并在 context.xml 中定义所有内容(就像这样..)

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="myDataSource" />
        <property name="annotatedClasses">
            <list>
                <value>mypackage.model.Attributes</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.MySQLDialect
                hibernate.show_sql=true
                hibernate.format_sql=true
            </value>
        </property>
    </bean>

在我的实体上,我有几个属性,一个是 id,另一个是我需要自动生成的字符串值“externalId”。(例如,它可能是“dev_”,后跟代表 id 的 5 位数值。因此,如果 id 为 4,则 externalId 将为“dev_00004”)

@Entity
@Table(name="ATTRIBUTES")
public class Attributes {

    private Long id;
    private String externalId;
    ...
    ...


    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column( name = "ID" )
    public Long getId() {
        return id;
    }

    public void setId( Long p_id ) {
        id = p_id;
    }

    @Column(name = "EXTERNALID")
    public String getExternalId() {
        return externalId;
    }
    public void setExternalId(String p_externalId) {
        externalId = p_externalId;
    }
    ...
    ...

有谁知道我怎么能做到这一点?我查看了@PrePersist,但所有 dao 等都使用 saveOrUpdate ,两者似乎并没有齐头并进。我想也许@preUpdate 可能会起作用,但是这似乎并没有被调用。谁能给我任何关于如何实现这一目标的想法?

谢谢!

4

3 回答 3

1

我查看了@PrePersist,但所有 dao 等都使用 saveOrUpdate ,两者似乎并没有齐头并进。我想也许@PreUpdate 可能会起作用,但是这似乎并没有被调用。

PrePersist/PreUpdate 是 JPA 注释,因此要使它们工作,您必须使用 EntityManager。

谁能给我任何关于如何实现这一目标的想法?

使用 Hibernate Core 中的“等价物”,即拦截器或事件系统。

参考

于 2010-08-29T22:15:39.323 回答
1

你试过了吗

public void setId( Long p_id ) {
        id = p_id;
        this.externalId = "dev_" + StringUtils.leftPad(p_id.toString(), 5, '0') );
    }

?

来自http://commons.apache.org/lang/api-2.5/index.html?org/apache/commons/lang/StringUtils.html的字符串实用程序

于 2010-10-07T02:16:44.620 回答
0

您可以实现PreInsertEventListener并将其挂接到您的 SessionFactory。然后实现侦听器以监视此特定对象类型并根据需要分配您的外部 ID。

您使用 spring factory bean 的 map 属性初始化事件侦听器。

  <property name="eventListeners" ref="hibernateEventListenerMap">

  <util:map id="hibernateEventListenerMap">
    <entry key="pre-insert">
      <list>
        <ref bean="customEventListenerBeanNameHere"/>
      </list>
    </entry>
  </util:map>
于 2010-08-29T21:25:59.883 回答