2017-06-06 2 views
1

Ich bin mit JPA und Hibernate als Anbieter, möchte ich eine Map<Embeddable, Double> mit @ElementCollection auf der Karte, aber wenn persisiting, bekam ich eine Hibernate Ausnahme:Warum benötigt Hibernate einen Standardkonstruktor für java.lang.Double?

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

Ich weiß, dass:

wenn Die Werte der Map sind entweder einbettbar oder grundlegende Typen. Die Map wird als Element-Collection zugeordnet. [Pro JPA 2 Zweite Auflage - Seite 102]

in meinem Fall also soll ich @ElementCollection verwenden, aber warum Doppel als Einheit überwintere betrachten und einen Standardkonstruktor fordern?

Hibernate/JPA Abhängigkeiten:

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

Meine Klassen (Ich verwende generische Typen mit Vererbung Einzeltisch-Strategie):

@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); 
    } 
} 
+1

Sie behandeln * es hier wie eine Entität. Es ist sehr, sehr unklar, was Sie erreichen wollen, indem Sie Generika auf Ihre Entitäten setzen. – Makoto

+0

Nur um mehr Einblick zu geben, habe ich eine andere Entität, die sich von 'SecondLevelBaseClass' ausdehnt, aber mit' SortedMap 'und ich kann es ohne Probleme bestehen lassen! –

+2

Das sieht wie ein Fehler in Hibernate aus. Haben Sie versucht, die Quelle des Problems einzugrenzen (z. B. "@ AttributeOverride", "@ Column" usw. zu entfernen, um zu sehen, ob Sie eine funktionierende Version finden können)? Beachten Sie, dass Sie 'nullable = false' nicht für die Vererbung einzelner Tabellen verwenden können – crizzis

Antwort

1

Als crizzis mention, wenn ich von @AttributeOverride loszuwerden, Ich kann ohne Ausnahme beibehalten (Es scheint wie ein Fehler in Hibernate), also habe ich eine Wrapper-Klasse von Double als @Embeddable erstellt, so dass meine Sammlung wird SortedMap<EmbeddableDate, EmbeddableDouble>.

die andere Lösung ist nicht EmbeddableDate Feld überhaupt außer Kraft zu setzen und ihre Spalten direkt in EmbeddableDate nennen, aber es war für meinen Fall nicht möglich, da ich EmbeddableDate an anderen Unternehmen mit bin (und ich werde seine Wiederverwertbarkeit verlieren! !).

Verwandte Themen