Spring - AutoWired对象NullPointerExpection,Sequence Generator

时间:2014-08-18 11:28:26

标签: java spring oracle hibernate spring-mvc

我们有以下错误

java.lang.NullPointerException
at sequence.MySequence.generate(MySequence.java:23)

我的序列生成器

    @Component
    public class MySequence implements IdentifierGenerator {

    @Autowired
    SequenceDAO sequenceDAO;

    public Serializable generate(SessionImplementor session, Object object)
            throws HibernateException {

        <-- sequenceDAO.getNextValue -->

        return sequenceNextValue;
    }
    }

SequenceDAO

    public interface SequenceDAO {

    Long getNextValue();

    }

SequenceDAOImpl

    @Repository
    @Transactional(readOnly = false)
    public class SequenceDAOImpl implements SequenceDAO {

    @Autowired
    SessionFactory sessionFactory;

    @Override
    @Transactional(readOnly = true)
    public Long getNextValue() {

        <-- getNextValue -->

        return nextValue;
    }
    }

配置

<context:annotation-config />
<context:component-scan base-package="controller" />
<context:component-scan base-package="dao" />
<context:component-scan base-package="service" />
<context:component-scan base-package="sequence" /> <-- is there MySequence

我不知道自己做错了什么。休息作为控制器,服务,DAO工作没有问题 - @autowired工作正常。只有在这里,我才不知道为什么会这样。

序列生成器需要它(Oracle数据库将id作为字符串; 因此,我不能直接从数据库中使用生成器)

@Id
@GenericGenerator(name="seqid", strategy="sequence.MySequence")
@GeneratedValue(generator="seqid")
@Column(name = "ID", unique = true, nullable = false, length = 32)
public String getId() {
    return this.id;
}

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

生成器类由Hibernate实现,因此它不受spring管理,也不会发生注入。您必须直接在方法SequenceDAO中的generate()中实现代码(您可以在参数中接收可以执行查询的会话),或者找到通过静态访问spring内容的方法方法并从中获取SequenceDAO