2017-07-28 19 views
-1

我想在Scala + Hibernate中實現一對多關係(一家銀行有很多分支機構)。我收到以下錯誤:在Scala +休眠中實現一對多關係

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

這些都是表:

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

而這些都是Hibernate類:

@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 = _ 
} 

當我運行一個選擇分支的錯誤恰巧還應該檢索相關銀行:

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

如何使這項工作?

回答

1

Hibernate的user guide狀態:

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] = _ 

您定義branches是一個Seq,但是Hibernate不認識的Scala集合類型。將branches的類型更改爲java.util.List[BranchHib]

0

使用java.util.List的,而不是序列:

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