Defining keys
Frequently we need more than just a primary key. Starting from
hibintro.v4.User
we may want to add a property
uidNumber
adding a common requirement: On UNIX type
operation systems each user does have both a unique login name (like
“goik”) and a unique numerical value (like
“123”). We choose our primary key to be numeric ❷and the login name to become a second
candidate key ❶:
package hibintro.v5; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.UniqueConstraint; @Entity @Table(uniqueConstraints={@UniqueConstraint
(columnNames
={"uid"})}) ❶ public class User { int uidNumber; @Id ❷ public int getUidNumber() { return uidNumber; } public void setUidNumber(int uidNumber) { this.uidNumber = uidNumber; } String uid; /** * @return The user's unique login name e.g. "goik" */ @Column(nullable=false) public String getUid() { return uid; } /** * @param uid, See {@link #getUid()}. */ public void setUid(String uid) { this.uid = uid; } ... }
Notice the slight difference: The property uid
may
need a
@
annotation to become a candidate key. This is not
automatically inferred by the
javax.persistence.Column
(nullable=false)javax.persistence.UniqueConstraint
definition
❶. In contrast the property
uidNumber
is not being referenced by the preceding
javax.persistence.Table
annotation but
annotated by javax.persistence.Id
. Hence a
nullable=false
is not needed.
This is in accordance with DDL:
Attributes composing a primary key must not allow NULL
values but attributes only appearing in UNIQUE declarations may become
NULL
.
The resulting DDL reads:
CREATE TABLE User (
uidNumber INT NOT NULL PRIMARY KEY,
cname VARCHAR(255) NOT NULL,
uid VARCHAR(255) NOT NULL UNIQUE
)