Annotation Type Any
-
@Target({METHOD,FIELD}) @Retention(RUNTIME) public @interface Any
Maps a to-one cardinality association taking values over several entity types which are not related by the usual entity inheritance, using a discriminator value stored on the referring side of the relationship.This is quite different to discriminated inheritance where the discriminator is stored along with the referenced entity hierarchy.
For example, consider an
Order
entity containingPayment
information, where aPayment
might be aCashPayment
or aCreditCardPayment
. An@Any
mapping would store the discriminator value identifying the concrete type ofPayment
along with the state of the associatedOrder
, instead of storing it with thePayment
entity itself.interface Payment { ... } @Entity class CashPayment { ... } @Entity class CreditCardPayment { ... } @Entity class Order { ... @Any @AnyKeyJavaClass(UUID.class) //the foreign key type @JoinColumn(name="payment_id") //the foreign key column @Column(name="payment_type") //the discriminator column @AnyDiscriminatorValue(discriminator="CASH", entity=CashPayment.class) @AnyDiscriminatorValue(discriminator="CREDIT", entity=CreditCardPayment.class) Payment payment; ... }
In this example,
Payment
is not be declared as an entity type, and is not annotated@Entity
. It might even be an interface, or at most just a mapped superclass, ofCashPayment
andCreditCardPayment
. So in terms of the object/relational mappings,CashPayment
andCreditCardPayment
would not be considered to participate in the same entity inheritance hierarchy. On the other hand,CashPayment
andCreditCardPayment
must have the same identifier type.It's reasonable to think of the "foreign key" in an
Any
mapping is really a composite value made up of the foreign key and discriminator taken together. Note, however, that this composite foreign key is only conceptual and cannot be declared as a physical constraint on the relational database table.AnyDiscriminator
,JdbcType
, orJdbcTypeCode
specifies the type of the discriminator.AnyDiscriminatorValue
specifies how discriminator values map to entity types.Column
orFormula
specifies the column or formula in which the discriminator value is stored.AnyKeyJavaType
,AnyKeyJavaClass
,AnyKeyJdbcType
, orAnyKeyJdbcTypeCode
specifies the type of the foreign key.JoinColumn
specifies the foreign key column.
Of course,
Any
mappings are disfavored, except in extremely special cases, since it's much more difficult to enforce referential integrity at the database level.- See Also:
ManyToAny
-
-
Optional Element Summary
Optional Elements Modifier and Type Optional Element Description FetchType
fetch
Specifies whether the value of the field or property may be lazily loaded or must be eagerly fetched:EAGER
specifies that the association must be eagerly fetched.boolean
optional
Whether the association is optional.
-
-
-
Element Detail
-
fetch
FetchType fetch
Specifies whether the value of the field or property may be lazily loaded or must be eagerly fetched:EAGER
specifies that the association must be eagerly fetched.LAZY
allows the association to be fetched lazily, but this is possible only when bytecode enhancement is used.
If not explicitly specified, the default is
EAGER
.- Default:
- jakarta.persistence.FetchType.EAGER
-
-
-
optional
boolean optional
Whether the association is optional.If the discriminator
Column
or theJoinColumn
are not nullable the association is always considered non-optional, regardless of this value.- Returns:
false
if the association cannot be null.
- Default:
- true
-
-