【问题标题】:how can i automatically generate a non id value in hibernate?如何在休眠中自动生成非 id 值?
【发布时间】:2011-04-05 12:28:57
【问题描述】:

我正在使用休眠注释、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 可能会起作用,但是这似乎并没有被调用。谁能给我任何关于如何实现这一目标的想法?

谢谢!

【问题讨论】:

    标签: hibernate spring annotations sessionfactory


    【解决方案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】:

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

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

      谁能告诉我如何实现这一目标?

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

      参考

      【讨论】:

        【解决方案3】:

        您可以实现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>
        

        【讨论】:

        • 谢谢,这很有帮助 - 现在就研究一下 :-)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        • 2015-06-18
        相关资源
        最近更新 更多