hibernate - @PostConstruct 在启动时填充数据库 - Spring Boot 2.2.4 升级
问题描述
我正在将我的应用程序从 Spring Boot 升级1.5
到2.2
. 现在我的数据库初始化不工作。
在我的情况下,罪魁祸首似乎是HibernateTransactionManager
当使用这个 my @PostConstruct
or@EventListener(ApplicationReadyEvent.class)
方法时没有保存到数据库,即使代码正在运行。删除transactionManager
bean时,@PostConstruct
代码工作正常。但是我的项目中有其他依赖于这个bean的代码,所以我需要它。
此外,如果我将相同的代码作为休息端点并手动运行它,它总是可以工作的。
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
return new HibernateTransactionManager(emf.unwrap(SessionFactory.class));
}
@EventListener(ApplicationReadyEvent.class)
public void initDateRanges(){
// Check if date ranges already present
if (!jsonBucketRepo.findById(DateRangeDto.ID).isPresent()) {
List<DateRangeDto> dateRangeDtoList = new ArrayList<>(5);
dateRangeDtoList.add(new DateRangeDto("TODAY", "moment().startOf('day').format(dateFormat)", "moment().endOf('day').format(dateFormat)"));
dateRangeDtoList.add(new DateRangeDto("YESTERDAY", "moment().subtract(1, 'days').startOf('day').format(dateFormat)", "moment().subtract(1, 'days').endOf('day').format(dateFormat)"));
dateRangeDtoList.add(new DateRangeDto("THIS_WEEK", "moment().startOf('isoweek').format(dateFormat)", "moment().endOf('isoweek').format(dateFormat)"));
dateRangeDtoList.add(new DateRangeDto("THIS_MONTH", "moment().startOf('month').format(dateFormat)", "moment().endOf('month').format(dateFormat)"));
dateRangeDtoList.add(new DateRangeDto("LAST_MONTH", "moment().subtract(1, 'months').startOf('month').format(dateFormat)", "moment().subtract(1, 'months').endOf('month').format(dateFormat)"));
JsonBucket rangeJson = DateRangeDto.dtoList2NewJsonBucket(dateRangeDtoList);
JsonBucket bucket = jsonBucketRepo.save(rangeJson);
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonPropertyOrder({"nameOfRange", "fromMomentSyntax", "toMomentSyntax"})
public class DateRangeDto {
public static final String ID = "daterange";
public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().findAndRegisterModules();
private String nameOfRange;
private String fromMomentSyntax;
private String toMomentSyntax;
public static List<DateRangeDto> jsonBucket2DtoList(JsonBucket result) throws IOException {
if(!result.id.equals(DateRangeDto.ID)){
throw new IllegalArgumentException(String.format("JsonBucket has to have ID '%s'", DateRangeDto.ID));
}
ObjectReader reader = DateRangeDto.OBJECT_MAPPER.readerFor(new TypeReference<List<DateRangeDto>>() {});
List<DateRangeDto> list = reader.readValue(result.getJsonNode());
return list;
}
public static JsonBucket dtoList2NewJsonBucket(List<DateRangeDto> rangeDtoList) {
JsonNode jsonNode = DateRangeDto.OBJECT_MAPPER.valueToTree(rangeDtoList);
JsonBucket jsonBucket = new JsonBucket(DateRangeDto.ID);
jsonBucket.setJsonNode(jsonNode);
return jsonBucket;
}
public static JsonNode dtoList2JsonNode(List<DateRangeDto> rangeDtoList) {
return DateRangeDto.OBJECT_MAPPER.valueToTree(rangeDtoList);
}
}
@Entity
@Table(name = "tt_json_bucket")
@Data
@NoArgsConstructor
@TypeDef(
name = "json-node",
typeClass = JsonNodeStringType.class
)
public class JsonBucket {
@Id
String id;
@Version
Integer version;
@Type(type = "json-node")
@Column(columnDefinition = "VARCHAR(2000)")
JsonNode jsonNode;
public JsonBucket(String id) {
this.id = id;
}
}
@Repository
public interface JsonBucketRepository extends CrudRepository<JsonBucket, String> {
}
解决方案
推荐阅读
- php - 来自 php 的 python 调用中的 MemoryError
- graph-theory - 操纵负加权有向图的边成本以允许使用 Dijkstra 算法
- android - 使用 ConstraintLayout 将 ImageView 与 TextView 基线对齐
- cygwin - apt-cyg 未被识别为内部或外部命令
- python-2.7 - 为什么在尝试使用 conda 安装 pypyodbc 时出现无法满足的错误?
- javascript - 找到提交表单的按钮
- ios - 确保 UICollectionView 中只有 1 个单元格处于活动状态
- excel - 将数字附加到标签名称并通过循环将 Excel 中的值分配给标题
- javascript - 如何将谷歌地图缩放到一定百分比的标记
- python-2.7 - 使用 Python 2.7.15 的文件相似性检查器