2017-07-28 2 views
-1

Ich versuche, eine Eins-zu-viele-Beziehung in Scala + Hibernate zu implementieren (eine Bank hat viele Verzweigungen). Ich erhalte den folgenden Fehler:Implementieren einer Eins-zu-viele-Beziehung in Scala + Hibernate

Initial SessionFactory creation failed.org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: admin.bank.manage.BankHib.branches

Dies sind die Tabellen:

CREATE TABLE banks (
    sk int NOT NULL, 
    code varchar(10) DEFAULT NULL, 
    name varchar(100) DEFAULT NULL, 
    version smallint DEFAULT NULL, 
    PRIMARY KEY (sk) 
) 

CREATE TABLE branches (
    sk smallint NOT NULL, 
    code varchar(10) DEFAULT NULL, 
    name varchar(100) NOT NULL, 
    descrip varchar(200) DEFAULT NULL, 
    bank_sk tinyint NOT NULL, // <== this is the bank sk column 
    notes text, 
    version smallint DEFAULT NULL, 
    state char(2) NOT NULL, 
    city varchar(45) DEFAULT NULL, 
    county varchar(45) DEFAULT NULL, 
    county_id int DEFAULT NULL, 
    zipcode varchar(20) DEFAULT NULL, 
    PRIMARY KEY (sk) 
) 

Und das sind die Hibernate-Klassen:

@Entity 
@Table(name = "banks") 
class BankHib { 

    @Id 
    var sk: Int = _ 

    var code: String = _ 
    var name: String = _ 
    var version: Int = _ 

    @OneToMany(orphanRemoval=false) 
    @JoinColumn(name="bank_sk") 
    var branches: Seq[BranchHib] = _ 
} 


@Entity 
@Table(name = "branches") 
class BranchHib { 

    @Id 
    var sk: Int = _ 

    var code: String = _ 
    var name: String = _ 
    var descrip: String = _ 
    var city: String = _ 
    var county: String = _ 

    @Column(name = "county_id") 
    var countyId: Int = _ 
    var state: String = _ 
    var zipCode: String = _ 
    var notes: String = _ 

    @ManyToOne 
    @JoinColumn(name="bank_sk", nullable=false) 
    var bank: BankHib = _ 

    var version: Int = _ 
} 

Der Fehler tritt auf, wenn ich eine ausgewählte von Filialen ausführen, sollte auch verwandte Banken abrufen:

val list = session.createQuery("from BranchHib order by name").list. 
          asScala.toList.map(_.asInstanceOf[BranchHib]) 

Wie funktioniert das?

Antwort

1

Die Hibernate user guide Zustände:

Hibernate uses its own collection implementations which are enriched with lazy-loading, caching or state change detection semantics. For this reason, persistent collections must be declared as an interface type. The actual interface might be java.util.Collection , java.util.List , java.util.Set , java.util.Map , java.util.SortedSet , java.util.SortedMap or even other object types (meaning you will have to write an implementation of org.hibernate.usertype.UserCollectionType).

@OneToMany(orphanRemoval=false) 
@JoinColumn(name="bank_sk") 
var branches: Seq[BranchHib] = _ 

Sie definieren branches ein Seq zu sein, aber Hibernate nicht Scala Sammlung Typen erkennen. Ändern Sie den Typ branches zu java.util.List[BranchHib].

0

Verwenden java.util.List statt Seq:

@OneToMany 
@JoinColumn(name="bank_sk") 
var branches: java.util.List[BranchHib] = _ 
Verwandte Themen