@Convert 未在 Maven 集成测试中考虑

@Convert not considered in maven integration test

我有一个简单的 LocalDateTime - 时间戳 - 转换器在 @Entity 中使用,如下所示:

@Converter(autoApply = true)
public class TimestampConverter implements AttributeConverter<LocalDateTime, Timestamp> {

  @Override
  public Timestamp convertToDatabaseColumn(LocalDateTime localDateTime) {
    return localDateTime == null ? null : DateUtil.convertToTimestamp(localDateTime);
  }

  @Override
  public LocalDateTime convertToEntityAttribute(Timestamp timestamp) {
    return timestamp == null ? null : DateUtil.convertToLocalDateTime(timestamp);
  }
}

这在 LocalDateTime 字段的实体中使用,如下所示:

@Entity
@Table(name = "LOG")
@Data
public class Log implements Serializable {

  @Id
  private long id;

  private String content;

  @Column(name = "DATE_RECORDED")
  @Convert(converter = TimestampConverter.class)
  private LocalDateTime dateRecorded;
}

需要进行此转换以避免空(空)值出现以下错误:

ORA-00932: inconsistent datatypes: expected TIMESTAMP got BINARY

假设针对 oracle-xe testcontainer 在本地执行以下测试工作得很好:

@Testcontainers
public class DbLogTest {

  protected static EntityManager entityManager;

  @Container
  protected static OracleContainer oracle = new OracleContainer();
  
  private static Map<String, String> getProperties() {
    Map<String, String> properties = new HashMap<>();
    properties.put("javax.persistence.jdbc.url", oracle.getJdbcUrl());
    properties.put("javax.persistence.jdbc.user", oracle.getUsername());
    properties.put("javax.persistence.jdbc.password", oracle.getPassword());
    return properties;
  }
  
  @BeforeAll
  static void beforeAll() {
    entityManager = Persistence.createEntityManagerFactory("persistenceUnitName", getProperties()).createEntityManager();
  }
  
  @Test
  public void insertLog() throws Exception {
    Log log = new Log();
    entityManager.persist(new Log());
    entityManager.flush();
    assertTrue(log.getId() > 0);
  }
}

由于上述错误,使用 maven build (mvn test) 执行相同测试失败。调试显示在maven测试中执行时根本没有调用转换器。

任何人都可以指出我理解并最终解决这个问题的正确方向吗?与 Maven 相比,在 IDE 中执行测试有什么区别?

作为解决方法,我可以放弃使用 LocalDateTime,但无论如何我想了解这个问题。

问题是由 MultiModuleBuild 引起的。实体和转换器与 DbLogTest 在不同的模块中。由于尚未进行整个构建,DbLogTest 的 Maven 测试 运行 导致了观察到的行为。执行 clean install 解决了问题。