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