【问题标题】:Why does hibernate demand a default constructor for java.lang.Double?为什么休眠需要 java.lang.Double 的默认构造函数?
【发布时间】: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&lt;Integer, Integer&gt;,我可以坚持下去而不会出现任何问题!
  • 这看起来像是 Hibernate 中的一个错误。您是否尝试过缩小问题的根源(例如删除@AttributeOverride@Column 等以查看是否可以找到有效的版本)?请注意,您不能将nullable=false 与单表继承一起使用

标签: java hibernate generics jpa


【解决方案1】:

作为crizzis mention,当我摆脱@AttributeOverride时,我可以毫无例外地坚持下去(这似乎是Hibernate中的一个错误),所以为了保持我覆盖键和值列名的能力,我'我创建了一个 Double 的包装类为@Embeddable,所以我的集合变成了SortedMap&lt;EmbeddableDate, EmbeddableDouble&gt;

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

【讨论】:

    猜你喜欢
    • 2019-03-01
    • 2012-12-25
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    相关资源
    最近更新 更多