首页 > 解决方案 > @PostConstruct 在启动时填充数据库 - Spring Boot 2.2.4 升级

问题描述

我正在将我的应用程序从 Spring Boot 升级1.52.2. 现在我的数据库初始化不工作。

在我的情况下,罪魁祸首似乎是HibernateTransactionManager当使用这个 my @PostConstructor@EventListener(ApplicationReadyEvent.class)方法时没有保存到数据库,即使代码正在运行。删除transactionManagerbean时,@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> {

}

标签: hibernatespring-bootjpapostconstruct

解决方案


推荐阅读