Hibernate @启动后构造填充数据库-Spring Boot 2.2.4升级

Hibernate @启动后构造填充数据库-Spring Boot 2.2.4升级,hibernate,spring-boot,jpa,postconstruct,Hibernate,Spring Boot,Jpa,Postconstruct,我正在将我的应用程序从Spring Boot1.5升级到2.2。现在我的数据库初始化无法工作 在我的例子中,罪魁祸首似乎是使用此my@PostConstruct或@EventListener(ApplicationReadyEvent.class)方法时,HibernateTransactionManager未保存到db,即使代码正在运行。删除transactionManagerbean时,@PostConstruct代码工作正常。但是我的项目中还有其他依赖于这个bean的代码,所以我需要它 另

我正在将我的应用程序从Spring Boot
1.5
升级到
2.2
。现在我的数据库初始化无法工作

在我的例子中,罪魁祸首似乎是使用此my
@PostConstruct
@EventListener(ApplicationReadyEvent.class)
方法时,HibernateTransactionManager未保存到db,即使代码正在运行。删除
transactionManager
bean时,
@PostConstruct
代码工作正常。但是我的项目中还有其他依赖于这个bean的代码,所以我需要它

另外,如果我将同一代码作为rest端点并手动运行它,它总是可以工作的

@Bean
公共平台transactionManager transactionManager(EntityManager工厂emf){
返回新的HibernateTransactionManager(emf.unwrap(SessionFactory.class));
}
@EventListener(ApplicationReadyEvent.class)
public void initDateRanges(){
//检查日期范围是否已存在
如果(!jsonBucketRepo.findById(DateRangeDto.ID).isPresent()){
List dateRangeDtoList=newarraylist(5);
dateRangeDtoList.add(新的DateRangeDto(“今天”,“时刻().startOf('day')).format(日期格式)”,“时刻().endOf('day').format(日期格式)”);
dateRangeDtoList.add(新的DateRangeDto(“昨天”,“时刻().subtract(1,'days')).startOf('day').format(日期格式)”,“时刻().subtract(1,'days').endOf('day').format(日期格式)”);
dateRangeDtoList.add(新的DateRangeDto(“本周”、“矩().startOf('isoweek').format(dateFormat)”、“矩().endOf('isoweek').format(dateFormat)”);
dateRangeDtoList.add(新的DateRangeDto(“本月”、“矩().startOf('MONTH').format(dateFormat)”,“矩().endOf('MONTH').format(dateFormat)”);
dateRangeDtoList.add(新的DateRangeDto(“最后一个月”,“moment().subtract(1,'月”).startOf('月').format(dateFormat)”,“moment().subtract(1,'月').endOf('月').format(dateFormat)”);
JsonBucket rangeJson=DateRangeDto.dtoList2NewJsonBucket(dateRangeDtoList);
JsonBucket=jsonBucketRepo.save(rangeJson);
}
}
@数据
@AllArgsConstructor
@诺尔格构装师
@JsonPropertyOrder({“范围名称”、“fromMomentSyntax”、“TomomontSyntax”})
公共类DateRangeDto{
公共静态最终字符串ID=“daterange”;
public static final ObjectMapper OBJECT_MAPPER=new ObjectMapper();
范围的私有字符串名称;
私有字符串fromMomentSyntax;
私有字符串语法;
公共静态列表jsonBucket2DtoList(JsonBucket结果)引发IOException{
如果(!result.id.equals(DateRangeDto.id)){
抛出新的IllegalArgumentException(String.format(“JsonBucket必须具有ID“%s”,DateRangeDto.ID));
}
ObjectReader reader=DateRangeDto.OBJECT\u MAPPER.readerFor(新类型引用(){});
List=reader.readValue(result.getJsonNode());
退货清单;
}
公共静态JsonBucket dtoList2NewJsonBucket(列表范围的列表列表){
JsonNode JsonNode=DateRangeDto.OBJECT\u MAPPER.valueToTree(rangeDtoList);
JsonBucket JsonBucket=新的JsonBucket(DateRangeDto.ID);
setJsonNode(jsonNode);
返回jsonBucket;
}
公共静态JsonNode dtoList2JsonNode(列表范围DTolist){
返回日期RangedTo.OBJECT\u MAPPER.valueToTree(rangeDtoList);
}
}
@实体
@表(name=“tt_json_bucket”)
@资料
@诺尔格构装师
@类型定义(
name=“json节点”,
typeClass=JsonNodeStringType.class
)
公共类JsonBucket{
@身份证
字符串id;
@版本
整数版本;
@类型(Type=“json节点”)
@列(columnDefinition=“VARCHAR(2000)”)
JsonNode-JsonNode;
公共JsonBucket(字符串id){
this.id=id;
}
}
@存储库
公共接口JsonBucketRepository扩展了Crudepository{
}

你能分享完整的jpa配置代码吗?当然,我会更新问题,我现在添加了实体等。除了
SQLServer2012Dialect
-设置之外,没有其他JPA配置您正在使用JPA为什么您甚至有
HibernateTransactionManager
默认的
JpaTransactionManager
应该就是您所需要的了我在其他地方也有hibernate代码,比如
sessionFactory.getCurrentSession()。在这里,如果没有Hibernate事务管理器,它将无法工作。我并没有让它同时工作……是的,罪魁祸首是HibernateTransactionManager。您可以使用
sessionsession=entityManager.unwrap(session.class)获取hibernate会话并使用JpaTransactionManager而不是HibernateTransactionManager