mapped superclass, version, and summary
This commit is contained in:
parent
7b5f66c292
commit
349ecee462
|
@ -103,7 +103,43 @@ It is in principle possible to mix field and property access using explicit `@Ac
|
||||||
We don't recommend doing this.
|
We don't recommend doing this.
|
||||||
====
|
====
|
||||||
|
|
||||||
Every entity must have an identifier attribute.
|
An entity class like `Book`, which does not extend any other entity class is called a _root entity_.
|
||||||
|
Every root entity must declare an identifier attribute.
|
||||||
|
|
||||||
|
[[entity-inheritance]]
|
||||||
|
=== Entity class inheritance
|
||||||
|
|
||||||
|
An entity class may `extend` another entity class.
|
||||||
|
|
||||||
|
[source,java]
|
||||||
|
----
|
||||||
|
@Entity
|
||||||
|
class AudioBook extends Book {
|
||||||
|
AudioBook() {}
|
||||||
|
...
|
||||||
|
}
|
||||||
|
----
|
||||||
|
|
||||||
|
A subclass entity inherits every persistent attribute of every entity it extends.
|
||||||
|
|
||||||
|
A root entity may also extend another class and inherit mapped attributes from the other class.
|
||||||
|
But in this case, the class which declares the mapped attributes must be annotated `@MappedSuperclass`.
|
||||||
|
|
||||||
|
[source,java]
|
||||||
|
----
|
||||||
|
@MappedSuperclass
|
||||||
|
class Versioned {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
class Book extends Versioned {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
----
|
||||||
|
|
||||||
|
Every entity must have an identifier attribute, but only a root entity class may declare an attribute annotated `@Id`.
|
||||||
|
Subclass entities always inherit the identifier attribute of the root entity.
|
||||||
|
|
||||||
[[identifier-attributes]]
|
[[identifier-attributes]]
|
||||||
=== Identifier attributes
|
=== Identifier attributes
|
||||||
|
@ -389,6 +425,20 @@ Either way, we may now use `BookId` to obtain instances of `Book`:
|
||||||
Book book = session.find(Book.class, new BookId(isbn, printing));
|
Book book = session.find(Book.class, new BookId(isbn, printing));
|
||||||
----
|
----
|
||||||
|
|
||||||
|
[[version-attributes]]
|
||||||
|
=== Version attributes
|
||||||
|
|
||||||
|
An entity may have an attribute which is used by Hibernate for optimistic lock checking.
|
||||||
|
A version attribute is usually of type `Integer` or `LocalDateTime`, though several other types are also allowed.
|
||||||
|
|
||||||
|
[source,java]
|
||||||
|
----
|
||||||
|
@Version
|
||||||
|
LocalDateTime lastUpdated;
|
||||||
|
----
|
||||||
|
|
||||||
|
The `@Id` and `@Version` attributes we've already seen are just specialized examples of _basic attributes_.
|
||||||
|
|
||||||
[[basic-attributes]]
|
[[basic-attributes]]
|
||||||
=== Basic attributes
|
=== Basic attributes
|
||||||
|
|
||||||
|
@ -1057,7 +1107,8 @@ Unfortunately, JPA does not define a standard way to map SQL arrays, but here's
|
||||||
----
|
----
|
||||||
@Entity
|
@Entity
|
||||||
class Event {
|
class Event {
|
||||||
@Id @GeneratedValue long id;
|
@Id @GeneratedValue
|
||||||
|
Long id;
|
||||||
...
|
...
|
||||||
@Array(length=7)
|
@Array(length=7)
|
||||||
DayOfWeek[] daysOfWeek; // stored as a SQL ARRAY type
|
DayOfWeek[] daysOfWeek; // stored as a SQL ARRAY type
|
||||||
|
@ -1090,7 +1141,8 @@ JPA _does_ define a standard way to map a collection to a table:
|
||||||
----
|
----
|
||||||
@Entity
|
@Entity
|
||||||
class Event {
|
class Event {
|
||||||
@Id @GeneratedValue long id;
|
@Id @GeneratedValue
|
||||||
|
Long id;
|
||||||
...
|
...
|
||||||
@ElementCollection
|
@ElementCollection
|
||||||
DayOfWeek[] daysOfWeek; // stored in a dedicated table
|
DayOfWeek[] daysOfWeek; // stored in a dedicated table
|
||||||
|
@ -1118,6 +1170,77 @@ Most likely, we'll realize that we need to add a separate entity after all.
|
||||||
There's much more we could say about "element collections", but we won't say it, because we don't want to hand you the gun that you'll shoot your foot with.
|
There's much more we could say about "element collections", but we won't say it, because we don't want to hand you the gun that you'll shoot your foot with.
|
||||||
====
|
====
|
||||||
|
|
||||||
|
[[entities-summary]]
|
||||||
|
=== Summary of annotations
|
||||||
|
|
||||||
|
Let's pause to remember the annotations we've met so far.
|
||||||
|
|
||||||
|
.Declaring entities and embeddable types
|
||||||
|
[cols="2,4,1"]
|
||||||
|
|===
|
||||||
|
| Annotation | Purpose | JPA-standard
|
||||||
|
|
||||||
|
| `@Entity` | Declare an entity class | ✓
|
||||||
|
| `@MappedSuperclass` | Declare a non-entity class with mapped attributes inherited by an entity | ✓
|
||||||
|
| `@Embeddable` | Declare an embeddable type | ✓
|
||||||
|
| `@Converter` | Register an `AttributeConverter` | ✓
|
||||||
|
|===
|
||||||
|
|
||||||
|
.Declaring basic attributes
|
||||||
|
[cols="2,4,1"]
|
||||||
|
|===
|
||||||
|
| Annotation | Purpose | JPA-standard
|
||||||
|
|
||||||
|
| `@Id` | Declare a basic-typed identifier attribute | ✓
|
||||||
|
| `@Version` | Declare a version attribute | ✓
|
||||||
|
| `@Basic` | (Optional) Declare a basic attribute | ✓
|
||||||
|
| `@EmbeddedId` | Declare an embeddable-typed identifier attribute | ✓
|
||||||
|
| `@Embedded` | (Optional) Declare an embeddable-typed attribute | ✓
|
||||||
|
| `@Enumerated` | (Optional) Declare an `enum`-typed attribute and specify how it is encoded | ✓
|
||||||
|
| `@Array` | (Optional) Declare that an attribute maps to a SQL `ARRAY`, and specify the length | ✗
|
||||||
|
| `@ElementCollection` | Declare that a collection is mapped to a dedicated table | ✓
|
||||||
|
|===
|
||||||
|
|
||||||
|
.Converters and compositional basic types
|
||||||
|
[cols="2,4,1"]
|
||||||
|
|===
|
||||||
|
| Annotation | Purpose | JPA-standard
|
||||||
|
|
||||||
|
| `@Convert` | Apply a converter to an attribute | ✓
|
||||||
|
| `@JavaType` | Explicitly specify an implementation of `JavaType` for a basic attribute | ✗
|
||||||
|
| `@JdbcType` | Explicitly specify an implementation of `JdbcType` for a basic attribute | ✗
|
||||||
|
| `@JdbcTypeCode` | Explicitly specify a JDBC type code used to determine the `JdbcType` for a basic attribute | ✗
|
||||||
|
| `@JavaTypeRegistration` | Register a `JavaType` for a given Java type | ✗
|
||||||
|
| `@JdbcTypeRegistration` | Register a `JdbcType` for a given JDBC type code | ✗
|
||||||
|
|===
|
||||||
|
|
||||||
|
.System-generated identifiers
|
||||||
|
[cols="2,4,1"]
|
||||||
|
|===
|
||||||
|
| Annotation | Purpose | JPA-standard
|
||||||
|
|
||||||
|
| `@GeneratedValue` | Specify that an identifier is system-generated | ✓
|
||||||
|
| `@SequenceGenerator` | Define an id generated backed by on a database sequence | ✓
|
||||||
|
| `@TableGenerator` | Define an id generated backed by a database table | ✓
|
||||||
|
| `@IdGeneratorType` | Declare an annotation that associates a custom `Generator` with each `@Id` attribute it annotates | ✗
|
||||||
|
| `@ValueGenerationType` | Declare an annotation that associates a custom `Generator` with each `@Basic` attribute it annotates | ✗
|
||||||
|
|===
|
||||||
|
|
||||||
|
.Declaring entity associations
|
||||||
|
[cols="2,4,1"]
|
||||||
|
|===
|
||||||
|
| Annotation | Purpose | JPA-standard
|
||||||
|
|
||||||
|
| `@ManyToOne` | Declare the single-valued side of a many-to-one association (the owning side) | ✓
|
||||||
|
| `@OneToMany` | Declare the many-valued side of a many-to-one association (the unowned side) | ✓
|
||||||
|
| `@ManyToMany` | Declare either side of a one-to-one association | ✓
|
||||||
|
| `@OneToOne` | Declare either side of a one-to-one association | ✓
|
||||||
|
| `@MapsId` | Declare that the owning side of a `@OneToOne` association maps the primary key column | ✓
|
||||||
|
|===
|
||||||
|
|
||||||
|
Phew!
|
||||||
|
That's already a lot of annotations, and we have not even started with the annotations for O/R mapping!
|
||||||
|
|
||||||
[[equals-and-hash]]
|
[[equals-and-hash]]
|
||||||
=== `equals()` and `hashCode()`
|
=== `equals()` and `hashCode()`
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue