我有一个简单的 LocalDateTime - Timestamp - 在@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;
}
需要进行此转换以避免在空(null)值上出现以下错误:
ORA-00932: 不一致的数据类型: 预期的 TIMESTAMP 得到 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);
}
}
mvn test
由于上述错误,使用 maven build ( ) 执行相同的测试失败。调试显示在 maven 测试中执行时根本没有调用转换器。
谁能指出我正确的方向理解并最终解决这个问题?与 Maven 相比,在 IDE 中执行测试有什么区别?
作为解决方法,我可以不使用 LocalDateTime 但无论如何我想了解这个问题。