ps0604
ps0604

Reputation: 1071

Implementing one-to-many relationship in Scala + Hibernate

I'm trying to implement a one-to-many relationship in Scala + Hibernate (one bank has many branches). I get the following error:

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

These are the tables:

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

And these are the Hibernate classes:

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

The error happens when I run a select of branches that should also retrieve related banks:

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

How to make this work?

Upvotes: 0

Views: 554

Answers (2)

Jeffrey Chung
Jeffrey Chung

Reputation: 19527

The Hibernate user guide states:

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

You define branches to be a Seq, but Hibernate doesn't recognize Scala collection types. Change the type of branches to java.util.List[BranchHib].

Upvotes: 1

ps0604
ps0604

Reputation: 1071

Use java.util.List instead of Seq:

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

Upvotes: 0

Related Questions