我们有以下错误
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;
}
有什么建议吗?
答案 0 :(得分:2)
生成器类由Hibernate实现,因此它不受spring管理,也不会发生注入。您必须直接在方法SequenceDAO
中的generate()
中实现代码(您可以在参数中接收可以执行查询的会话),或者找到通过静态访问spring内容的方法方法并从中获取SequenceDAO
。