【发布时间】:2019-11-29 20:28:23
【问题描述】:
我正在尝试在 Spring-MVC 启动应用程序中使用自定义 ID 生成器。
但是,不是 Spring 创建 ID 生成器的实例,而是 hibernate 正在创建它,因此当我访问 ID 生成器的自动装配依赖项时,我得到了NullPointerException。
如何告诉 hibernate 不要创建自定义 ID 生成器的实例并允许 Spring 这样做?
我尝试将@Component 添加到自定义ID 生成器类,但似乎hibernate 无论如何都在创建一个实例。
我也经历过Configure custom hibernate id generator in spring context,但不明白如何解决这个问题。
代码片段如下:
实体类
实体类:这是我在策略自定义 ID 生成器中提到的模型类,即要使用的 KE_IDGenerator。
@Entity
@Table(name="TAB_Error")
public class KnownErrorDto {
@Id
@GenericGenerator(name="seq_id", strategy="x.x.x.x.IdGenerator.KE_IDGenerator"
)
@GeneratedValue(generator="seq_id")
@Column(name ="KEID")
String KEID;
}
道类 道:在这个界面中,我提到了一个带有原生查询的方法,它给出下一个序列值。
public interface KnownErrorDaoInterface extends CrudRepository<KnownErrorDto,Integer> {
@Query(value = "SELECT TAB_Err_SEQ.nextval FROM dual", nativeQuery =
true)
int getNextSeqForKnownError();
}
自定义 ID 生成器类
自定义 ID 生成器:这是从 Dao 获取序列值并返回自定义 ID 的类
public class KE_IDGenerator implements IdentifierGenerator {
@Autowired
KnownErrorDaoInterface knownErrorDaoInterface;
@Override
public Serializable generate(SharedSessionContractImplementor session, Object object)
throws HibernateException {
String prefix = "KE";
int id=knownErrorDaoInterface.getNextSeqForKnownError();
String keId=null;
keId=prefix + StringUtils.leftPad("" + id,9, '0');
return keId;
}
}
我遇到以下错误:
2019-07-21 20:11:11.165 ERROR 1900 --- [nio-8083-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
at
x.x.x.x.IdGenerator.KE_IDGenerator.generate(KE_IDGenerator.java:27) ~[classes/:na]
我希望 KE_IDGenerator 使用KnownErrorDaoInterface 提供的序列值生成自定义 ID。但是当我尝试访问KnownErrorDaoInterface 时,我得到了null 指针。
【问题讨论】:
标签: hibernate spring-boot spring-mvc