如何在hibernate中自动生成非id值?

时间:2010-08-29 20:39:15

标签: hibernate spring annotations sessionfactory

我正在使用hibernate注释,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可能会起作用,但是再次看起来并没有被调用。任何人都可以给我任何关于如何实现这一目标的想法吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

  

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

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

  

任何人都可以告诉我如何实现这一目标吗?

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

参考

答案 1 :(得分: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

的字符串工具

答案 2 :(得分: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>