2

私は休止状態の注釈、春、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>

私のエンティティにはいくつかのプロパティがあります.1つはIDで、もう1つは自動的に生成する必要がある文字列値「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を使用しており、2つは連携していないようです。おそらく @preUpdate が機能するのではないかと思いましたが、これも呼び出されないようです。どうすればこれを達成できるかについて、誰かにアイデアを教えてもらえますか?

ありがとう!

4

3 に答える 3

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 に答える
1

私は@PrePersistを調べましたが、すべてのdaoなどはsaveOrUpdateを使用しており、2つは連携していないようです。おそらく @PreUpdate が機能するのではないかと思いましたが、やはり呼び出されないようです。

PrePersist/PreUpdate は JPA アノテーションであるため、それらを機能させるには、EntityManager を使用する必要があります。

どうすればこれを達成できるかについて、誰かにアイデアを教えてもらえますか?

Hibernate Core の「同等のもの」、つまりインターセプターまたはイベント システムを使用します。

参照

于 2010-08-29T22:15:39.323 に答える
0

PreInsertEventListenerを実装して、SessionFactory にフックできます。次に、この特定のオブジェクト タイプを監視するリスナーを実装し、必要に応じて外部 ID を割り当てます。

Spring ファクトリー Bean のマップ・プロパティーを使用して、イベント・リスナーを初期化します。

  <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 に答える