【发布时间】:2017-06-06 15:01:29
【问题描述】:
我正在使用 JPA 和 Hibernate 作为提供程序,我想将 Map<Embeddable, Double> 与 @ElementCollection 映射,但是在持续存在时,我遇到了休眠异常:
javax.persistence.PersistenceException: org.hibernate.InstantiationException: No default constructor for entity: java.lang.Double
我知道:
如果 Map 的值是可嵌入类型或基本类型,则 Map 被映射为元素集合。 [Pro JPA 2 第二版- 第 102 页]
所以在我的情况下我应该使用@ElementCollection,但是为什么hibernate将Double视为一个实体并要求一个默认构造函数?
Hibernate/JPA 依赖项:
<properties>
<hibernate.version>5.2.10.Final</hibernate.version>
</properties>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
....
<dependencies>
我的类(我使用具有继承单表策略的泛型类型):
@Entity
@Table(name = "GENERIC_STAFF")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "My_Discriminator", discriminatorType = DiscriminatorType.STRING, length = 255)
public class FirstLevelBaseClass {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
public Long getId() {
return id;
}
}
@Getter @Setter
public class SecondLevelBaseClass <K extends Serializable, V extends Serializable, M extends Map<K, V>> extends FirstLevelBaseClass{
private M value;
}
@Entity // Class that I want to persist
@DiscriminatorValue(value = "My_DoubleMapClass")
@Access(AccessType.PROPERTY)
public class DoubleMapClass extends SecondLevelBaseClass<EmbeddableDate, Double, SortedMap<EmbeddableDate, Double>>{
@Override
@ElementCollection
@CollectionTable(joinColumns = @JoinColumn(name = "ID_GENERIC"))
@AttributeOverrides({
@AttributeOverride(name = "key.start", column = @Column(name = "START")),
@AttributeOverride(name = "key.end", column = @Column(name = "END"))
})
@Column(nullable = false, name = "MyValue")
@OrderBy
public SortedMap<EmbeddableDate, Double> getValue() {
return super.getValue();
}
@Override
public void setValue(SortedMap<EmbeddableDate, Double> value) {
super.setValue(value);
}
}
【问题讨论】:
-
你在对待它就像一个实体。通过在实体上放置泛型来实现您的目标非常非常不清楚。
-
只是为了提供更多见解,我有另一个实体,它从
SecondLevelBaseClass扩展而来,但使用SortedMap<Integer, Integer>,我可以坚持下去而不会出现任何问题! -
这看起来像是 Hibernate 中的一个错误。您是否尝试过缩小问题的根源(例如删除
@AttributeOverride、@Column等以查看是否可以找到有效的版本)?请注意,您不能将nullable=false与单表继承一起使用
标签: java hibernate generics jpa