Как я могу автоматически генерировать не идентификатор значение в спящем режиме? - PullRequest
2 голосов
/ 30 августа 2010

Я использую аннотации в спящем режиме, 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>

На моем объекте у меня есть несколько свойств, одно из которых является идентификатором, а другое - строковым значением "externalId", которое мне нужно сгенерировать автоматически. (в качестве примера это может быть «dev_», за которым следует 5-значное числовое значение, представляющее идентификатор. Поэтому, если идентификатор равен 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, но все дао и т. Д. Используют saveOrUpdate, и эти два, похоже, не идут рука об руку. Я подумал, что, возможно, @preUpdate может сработать, но, опять же, это не вызывается. Может ли кто-нибудь дать мне какие-либо идеи о том, как я мог бы достичь этого?

Спасибо!

Ответы [ 3 ]

1 голос
/ 30 августа 2010

Я заглянул в @PrePersist, но все дао и т. Д. Используют saveOrUpdate, и эти два, похоже, не идут рука об руку. Я подумал, что, возможно, @PreUpdate может сработать, но, опять же, это не вызывается.

PrePersist / PreUpdate - это аннотации JPA, поэтому для их работы вам придется использовать EntityManager.

Может кто-нибудь дать мне какие-нибудь идеи о том, как мне этого добиться?

Используйте «эквивалент» из Hibernate Core, то есть перехватчик или систему событий.

Ссылки

1 голос
/ 07 октября 2010

Вы пробовали

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

0 голосов
/ 30 августа 2010

Вы можете реализовать PreInsertEventListener и подключить его к вашей SessionFactory.Затем внедрите прослушиватель для отслеживания этого конкретного типа объекта и при необходимости выделите внешний идентификатор.

Вы инициализируете прослушиватели событий, используя свойство map бина фабрики пружин.

...