在Scala + Hibernate中实现一对多关系

时间:2017-07-28 21:33:22

标签: scala hibernate

我试图在Scala + Hibernate中实现一对多关系(一个银行有很多分支)。我收到以下错误:

  

创建初始SessionFactory   failed.org.hibernate.AnnotationException:非法尝试映射非   收集为@OneToMany,@ ManyToMany或@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])

如何使这项工作?

2 个答案:

答案 0 :(得分:1)

Hibernate user guide声明:

  

Hibernate使用自己的集合实现,这些集合实现了惰性加载,缓存或状态更改检测语义。因此,必须将持久集合声明为接口类型。实际界面可能是java.util.Collectionjava.util.Listjava.util.Setjava.util.Mapjava.util.SortedSetjava.util.SortedMap或甚至其他对象类型(意味着您将拥有编写org.hibernate.usertype.UserCollectionType)的实现。

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

您将branches定义为Seq,但Hibernate无法识别Scala集合类型。将branches的类型更改为java.util.List[BranchHib]

答案 1 :(得分:0)

使用java.util.List而不是Seq:

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