1

hibernate用に作成されたカスタムSequenceGeneratorがあります。

public class LoginGenerator extends SequenceGenerator {

    @Autowired
    ITicketService ticketService;

    @Override
    public Serializable generate(SessionImplementor session, Object obj) {
        Ticket ticket = (Ticket) obj;
        Long maxCounterOfSection = ticketService.findMaxSectionCounter(ticket
            .getSection());
        maxCounterOfSection++;
        return ticket.getSection() + "-" + maxCounterOfSection;
    }
}

しかし、私はこのジェネレーターの中に春のコンテキストを持っていません!ticketServiceがnullです。ジェネレーターの@Componentアノテーションをすでに試しましたが、成功しませんでした。

PS:私は春3.2.0-FINALとhibernate 3.6.10-FINALを使用していますが、hibernate4に更新する方法はありません!

何か考え、誰か?

4

1 に答える 1

3

上記のように、ApplicationContextAwareクラスで問題が解決しました。

public class ApplicationContextProvider implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    @SuppressWarnings("static-access")
    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        this.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static <T> T getBean(Class<T> requiredType) {
        return applicationContext.getBean(requiredType);
    }

    public static <T> T getBean(String name, Class<T> requiredType) {
        return applicationContext.getBean(name, requiredType);
    }
}

applicationContext.xml追加しまし<bean id="applicationContextProvider" class="de.gfz.rz.spring.ApplicationContextProvider"></bean>た。

そしてここでの使用法:

public class LoginGenerator extends SequenceGenerator {

    @Override
    public Serializable generate(SessionImplementor session, Object obj) {
        ITicketService ticketService = ApplicationContextProvider
            .getBean(ITicketService.class);
        Ticket ticket = (Ticket) obj;
        Long maxCounterOfSection = ticketService.findMaxSectionCounter(ticket
            .getSection());
        maxCounterOfSection++;
        return ticket.getSection() + "-" + maxCounterOfSection;
    }
}
于 2013-01-23T23:39:04.557 に答える