【问题标题】:Implementing one-to-many relationship in Scala + Hibernate在 Scala + Hibernate 中实现一对多关系
【发布时间】:2017-07-28 21:33:22
【问题描述】:

我正在尝试在 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])

如何做到这一点?

【问题讨论】:

    标签: scala hibernate


    【解决方案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]

    【讨论】:

      【解决方案2】:

      使用 java.util.List 代替 Seq:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-16
        • 1970-01-01
        • 2011-09-30
        • 2017-01-06
        • 2015-02-05
        • 2014-03-29
        • 1970-01-01
        相关资源
        最近更新 更多