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);
}
}
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
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! –
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