【发布时间】:2015-07-03 21:52:38
【问题描述】:
我正在使用 Java 8 的 java.time.LocalDate,并希望将其转换为 sql date 以便可以持久化。这是我的转换器:
@Converter(autoApply = true)
public class LocalDatePersistenceConverter implements
AttributeConverter<LocalDate, Date> {
@Override
public Date convertToDatabaseColumn(LocalDate attribute) {
return java.sql.Date.valueOf(attribute);
}
@Override
public LocalDate convertToEntityAttribute(Date dbData) {
return dbData.toLocalDate();
}
}
以下是它的使用方法:
@Entity
@Access(AccessType.FIELD)
public class MutualFund implements Serializable {
@Id
private final String schemeName;
@Convert(attributeName="key",converter=LocalDatePersistenceConverter.class)
@ElementCollection
private Map<LocalDate, Price> nav;
//Other fields and methods
}
当我尝试持久化 MutualFund 对象时,出现以下异常:
java.lang.IllegalStateException: @Convert placed on Map attribute [mypackage.MutualFund.nav] must define attributeName of 'key' or 'value'
这段代码有什么问题?请帮忙。谢谢。
【问题讨论】:
-
这对我来说是正确的。您确定您正在运行您向我们展示的代码吗?不相关:schemeName 不应该是最终的。
-
@JBNizet 是的。但是,我没有在任何地方对“LocalDatePersistenceConverter”进行任何配置。它只是简单地注释,然后在 MutualFund 类中使用,如图所示。
-
我已将 schemeName 作为最终名称,因为一旦宣布共同基金计划的名称在其生命周期内不会改变。
-
确实如此:JPA 首先通过调用其无参数构造函数来实例化实体,然后使用反射设置字段的值。
-
是的,但从逻辑上讲它不会改变。我不希望任何人在任何时候都只是设置共同基金的名称。对于 JPA,我提供了带有打包私有访问权限的无参数构造函数。