java - 为什么 hibernate 需要 java.lang.Double 的默认构造函数?

标签 java hibernate generics jpa

我使用 JPA 和 Hibernate 作为提供程序,我想映射 Map<Embeddable, Double>@ElementCollection ,但是当坚持时,我遇到了 hibernate 异常:

javax.persistence.PersistenceException: org.hibernate.InstantiationException: No default constructor for entity: java.lang.Double

我知道:

if the values of the Map are either embeddable or basic types, the Map is mapped as an element collection. [Pro JPA 2 Second edition- Page 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);
    }
}

最佳答案

crizzis mention ,当我摆脱@AttributeOverride时,我可以毫无异常(exception)地坚持下去(这似乎是 Hibernate 中的一个错误),因此为了保持覆盖键和值列名称的能力,我创建了 Double 的包装类为 @Embeddable ,所以我的 Collection 变成 SortedMap<EmbeddableDate, EmbeddableDouble> .

另一个解决方案是不覆盖 EmbeddableDate字段并直接在 EmbeddableDate 中命名它们的列,但这对我来说是不可能的,因为我正在使用 EmbeddableDate在其他实体中(我将失去它的可重用性!)。

关于java - 为什么 hibernate 需要 java.lang.Double 的默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44393507/

相关文章:

java - 为什么 "--i"和 "i--"在 Java for 循环中具有相同的行为?

java - 在 Blackberry 手机中打开 Microsoft Access 数据库

java - 在 “Integer cannot be converted to E[]”中遇到错误,但在其他地方可以使用?

java - 为什么Class类需要是Generic类?

java - 如何将多个 MySql 连接查询转换为 Hibernate 查询?

c# - 如何在C#中调用泛型重载方法

java - Eclipse 生成复制构造函数

java - 是否不鼓励在同一领域使用 @Spy 和 @InjectMocks?

hibernate - 如何让 Hibernate 在它创建的表/字段上添加注释

java - 如何减少部分冲洗