Derby/JavaDB Mit JPA und Hibernate Arrays persistieren

T_O_B_E_E

Mitglied
Hallo zusammen,
hat jemand eine Idee wie ich mit JPA und Hibernate Arrays speichern kann? Mit List beispielsweise gibt es keine Probleme, mit einem "normalen" Double[] array funktioniert es aber nicht.
Hier mal meine Testklasse:
Code:
@Entity
public class MyTest {

    @Id
    @GeneratedValue
    private Long id;

    @ElementCollection
    @OrderColumn
    private List<Double> myList = new Vector<Double>(); // !!! Geht !!!

    @ElementCollection
    @OrderColumn
    Double[] testMatrix; // !!! Geht nicht !!!

    public MyTest() {
    }

    private void createData() {
        testMatrix = new Double[10000];
        Arrays.fill(testMatrix, 9.3);
        
        myList = new Vector();
        myList.add(9.3);
        myList.add(9.4);
        myList.add(9.5);
    }

    public void store() {
        createData();
        EntityManager em = Installer.getEntityManager();
        try {
            em.getTransaction().begin();
            em.persist(this);
        } catch (Exception e) {
            System.out.println("Fehler: " + e.getMessage());
        } finally {
            em.getTransaction().commit();
            em.close();
        }
    }
}
Dankeund Gruß
 
wenn du anstatt

Java:
Double[] testMatrix;

Java:
Double[] testMatrix= new Double[10000];

machst.

Obwohl hibernate mit refelction arbeitet, könnte ich mich vorstellen, dass er zumindest Typ und Dimension kennen muss? ???:L
 
wenn du anstatt

Java:
Double[] testMatrix;

Java:
Double[] testMatrix= new Double[10000];

machst.

Obwohl hibernate mit refelction arbeitet, könnte ich mich vorstellen, dass er zumindest Typ und Dimension kennen muss? ???:L


Klappt leider auch nicht :bahnhof:. Die Fehlermeldung ist:

java.lang.IllegalArgumentException: Expecting collection type [[Ljava.lang.Double;]
at org.hibernate.ejb.metamodel.AttributeFactory.determineCollectionType(AttributeFactory.java:889)
at org.hibernate.ejb.metamodel.AttributeFactory$PluralAttributeMetadataImpl.<init>(AttributeFactory.java:750)
at org.hibernate.ejb.metamodel.AttributeFactory$PluralAttributeMetadataImpl.<init>(AttributeFactory.java:731)
at org.hibernate.ejb.metamodel.AttributeFactory.determineAttributeMetadata(AttributeFactory.java:518)
at org.hibernate.ejb.metamodel.AttributeFactory.buildAttribute(AttributeFactory.java:93)
at org.hibernate.ejb.metamodel.MetadataContext.wrapUp(MetadataContext.java:183)
at org.hibernate.ejb.metamodel.MetamodelImpl.buildMetamodel(MetamodelImpl.java:66)
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:84)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:902)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
at org.hibernate.EntityManagerProvider.getEntityManager(EntityManagerProvider.java:46)
at org.Installer.<clinit>(Installer.java:20)
Caused: java.lang.ExceptionInInitializerError
 
mit double[] hast du es ja schonmal probiert? obwohl das ja kein Problem sein sollte, denk ich

Ja, damit habe ich es probiert. Klappt leider auch nicht. ;(

Übers XML Mapping habe ich es auch nicht geschafft. Ich kann mir gar nicht vorstellen, dass man keine normalen Java Arrays mit JPA und Hibernate speichern kann. Aber auch ewige Netzrecherche bringt keine Lösung. Hab gesehen, dass es mit JDO gehen soll:
Vergleich JDO <-> JPA
Da steht auch, dass JPA primitve Java Datentypen bis auf einige wenige (char, Byte, Date, ...) nicht unterstüzt.
Dabei dachte ich JPA mit Hibernate ist "State-of-the-art"...
 
Hallo,

eigentlich kein Problem. Hier ein Beispiel mit XML-Mapping
How to map an array using hibernate? | web development helpdesk
und Annotations
Hibernate Annotations

Vielen Dank für die Links!
Die Annotation @CollectionOfElements ist mittlerweile deprecated und ersetzt durch @ElementCollection. Damit klappt die Speicherung aber auch nicht.
Es gibt wieder die IllegalArgumentException: "Expecting collection type [[Ljava.lang.Double;]"

Die Membervariable sieht jetzt folgendermassen aus:
Code:
@ElementCollection
@Column(name = "testMatrix", nullable = false)
@IndexColumn(name="nbr_index")
private Double testMatrix[];

Die Exception sagt ja so wie ich das sehe, dass ein 2Dim Array erwartet wird, oder!? :shock:

EDIT: Ich habe es nochmal nach der neuesten Doku versucht.
@ElementCollection. Damit sieht die Membervariable so aus:
Code:
@ElementCollection
@CollectionTable(name="testMatrix", joinColumns=@JoinColumn(name="id"))
@Column(name="order_Nr")
@OrderColumn
private Double testMatrix[];
Das produziert den gleichen Fehler...
 
Zuletzt bearbeitet:
Ich habe mir die AttributeFactory Klasse von Hibernate einmal angeschaut.
Die Fehlermeldung wird von der Methode determineCollectionType produziert:
Java:
public static PluralAttribute.CollectionType determineCollectionType(Class javaType) {
865		if ( java.util.List.class.isAssignableFrom( javaType ) ) {
866			return PluralAttribute.CollectionType.LIST;
867		}
868		else if ( java.util.Set.class.isAssignableFrom( javaType ) ) {
869			return PluralAttribute.CollectionType.SET;
870		}
871		else if ( java.util.Map.class.isAssignableFrom( javaType ) ) {
872			return PluralAttribute.CollectionType.MAP;
873		}
874		else if ( java.util.Collection.class.isAssignableFrom( javaType ) ) {
875			return PluralAttribute.CollectionType.COLLECTION;
876		}
877		else {
878			throw new IllegalArgumentException( "Expecting collection type [" + javaType.getName() + "]" );
879		}
880	}
Scheinbar ist es tatsächlich nicht möglich Arrays direkt zu speichern. Kennt jemand eine Alternative? ???:L
 
Ich habe mich jetzt nach langem Zögern dazu durchgerungen meine gesamte Applikation auf die Nutzung von ArrayList etc. umzustellen. Also alle
Code:
double[]
arrays mit
Code:
Arrays.asList(...)
umwandeln.
Mit eindimensionalen Arrays geht das Persistieren. Mit zweidimensionalen Arrays, also
Code:
List<List<Double>>
geht es nicht.
Da gibt es eine MappingException ("Could not determine type for: java.util.List, at table: MyTest_testMatrixSaver, for columns: [org.hibernate.mapping.Column(testMatrixSaver)]").

Hat jemand schon einmal verschachtelte Listen gespeichert?

Danke und Gruß
 

Zurück
Oben