gpt4 book ai didi

java - 如何使用@Convert转换Map(JPA)的键?

转载 作者:行者123 更新时间:2023-11-30 03:27:23 26 4
gpt4 key购买 nike

我正在使用Java 8的java.time.LocalDate,并且想要将其转换为sql日期以便它可以被持久化。这是我的转换器:

@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'

这段代码有什么问题?请帮忙。谢谢。

最佳答案

您的 map 映射尚未完成,因此您遇到了异常。

map 映射有两个选项,不确定您想要实现哪一个。

A) 导航 map 的 LocalDate 键是 Price 对象的字段:

@Embeddable
public class Price implements Serializable {
@Convert(converter=LocalDatePersistenceConverter.class)
//you don't need @convert if it is annotated with @Converter(autoApply = true)
public LocalDate mark;
public double price;
}

然后在您的集合映射中,您需要指定使用的关键字段:

@ElementCollection
@MapKey(name="mark")
public Map<LocalDate, Price> nav;

B) nav 的关键元素不是 Price 对象的一部分,那么您需要将其显式映射到列:

@Embeddable
public class Price implements Serializable {
public double price;
}

和 map 注释:

@Convert(converter=LocalDatePersistenceConverter.class)
@ElementCollection
@MapKeyColumn(name="mark")
public Map<LocalDate, Price> nav;

编辑事实证明,Hibernate 比 EclipseLink 要求最高

使用@Converter(autoApply = true),它无需指向具有显式和隐式键列的转换器即可工作。

@ElementCollection
@MapKeyColumn(name="mark") //this annotation can be omitted then the key column is called nav_KEY
public Map<LocalDate, Price> nav;

如果没有 autoApply,我无法让它工作。仅当使用 attributeName="key."声明转换器时才能构建持久上下文。:

@Convert(attributeName="key.", converter=LocalDatePersistenceConverter.class)
@ElementCollection
public Map<LocalDate, Price> nav = new HashMap<>();

但是转换器没有正确应用。在模式生成期间,尝试将键列生成为 BLOB(由于未给出长度而失败),并且在插入/获取期间触发序列化而不是转换。我找不到修复它的方法。

关于java - 如何使用@Convert转换Map(JPA)的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29861951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com