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



我正在尝试在Scala + Hibernate中实现一对多关系(一家银行有许多分支机构(。我收到以下错误:

初始会话工厂创建 failed.org.hibernate.AnnotationException:非法尝试映射非 作为@OneToMany、@ManyToMany或@CollectionOfElements集合: admin.bank.manage.BankHib.branch

这些是表格:

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

这些是休眠类:

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

如何做到这一点?

Hibernate用户指南指出:

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]

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

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

最新更新