Declaring composite keys for self documentation and fulfilling KeyedEntity’s contract
The most compelling reason to use composite key is to implement the
KeyedEntity trait (and enable it’s functionality). It also has the
advantage of documenting the fact that fields/columns form a composite
key. Another benefit is that equality expressions can be shortened.
Consider the following example where CourseAssignment is a
KeyedEntity[CompositeKey2[Long,Long]]
CourseAssignment.id is a unique identifier for a CourseAssignment. In
this case id is what makes the class a
KeyedEntity[CompositeKey2[Long,Long]]. A class can have any number
of composite keys, a composite key is not necessarily a primary key.
- Important: Squeryl will create a uniqueness constraint on
composite keys that form the id of a KeyedEntity[_]
- Important: a compositeKey cannot be a val it must be a
def
A composite key can be used in any equality expression (x === y),
against a
composite key or a tuple that is compatible, i.e. that has the same type
parameters, ex.:
- CompositeKey3[String,Long,float] is compatible with
Tuple3(String,Long,Float)
- CompositeKey2[Long,Int] is not compatible with
Tuple2(Long,Long)
Note CompositeKeys cannot be used as binding expressions in
relations (see : issue
25)