/* * Copyright (c) 2008, 2009 Sun Microsystems. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Linda DeMichiel - Java Persistence 2.0 - Version 2.0 (October 1, 2009) * Specification available from http://jcp.org/en/jsr/detail?id=317 */ // $Id: AttributeOverride.java 20957 2011-06-13 09:58:51Z stliu $ package javax.persistence; import java.lang.annotation.Target; import java.lang.annotation.Retention; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * Used to override the mapping of a <code>Basic</code> (whether * explicit or default) property or field or <code>Id</code> property or * field. * * <p> May be applied to an entity that extends a mapped superclass or * to an embedded field or property to override a basic mapping or id * mapping defined by the mapped superclass or embeddable class (or * embeddable class of one of its attributes). * <p> May be applied to an element collection containing instances of * an embeddable class or to a map collection whose key and/or value * is an embeddable class. When <code>AttributeOverride</code> is * applied to a map, "<code>key.</code>" or "<code>value.</code>" must * be used to prefix the name of the attribute that is being * overridden in order to specify it as part of the map key or map * value. * * <p> To override mappings at multiple levels of embedding, a dot (".") * notation form must be used in the <code>name</code> element to indicate an * attribute within an embedded attribute. The value of each identifier * used with the dot notation is the name of the respective embedded * field or property. * * <p> If <code>AttributeOverride</code> is not specified, the column * is mapped the same as in the original mapping. * * <pre> * Example 1: * * @MappedSuperclass * public class Employee { * @Id protected Integer id; * @Version protected Integer version; * protected String address; * public Integer getId() { ... } * public void setId(Integer id) { ... } * public String getAddress() { ... } * public void setAddress(String address) { ... } * } * * @Entity * @AttributeOverride(name="address", column=@Column(name="ADDR")) * public class PartTimeEmployee extends Employee { * // address field mapping overridden to ADDR * protected Float wage(); * public Float getHourlyWage() { ... } * public void setHourlyWage(Float wage) { ... } * } * * * Example 2: * * @Embeddable public class Address { * protected String street; * protected String city; * protected String state; * @Embedded protected Zipcode zipcode; * } * * @Embeddable public class Zipcode { * protected String zip; * protected String plusFour; * } * * @Entity public class Customer { * @Id protected Integer id; * protected String name; * @AttributeOverrides({ * @AttributeOverride(name="state", * column=@Column(name="ADDR_STATE")), * @AttributeOverride(name="zipcode.zip", * column=@Column(name="ADDR_ZIP")) * }) * @Embedded protected Address address; * ... * } * * * Example 3: * * @Entity public class PropertyRecord { * @EmbeddedId PropertyOwner owner; * @AttributeOverrides({ * @AttributeOverride(name="key.street", * column=@Column(name="STREET_NAME")), * @AttributeOverride(name="value.size", * column=@Column(name="SQUARE_FEET")), * @AttributeOverride(name="value.tax", * column=@Column(name="ASSESSMENT")) * }) * @ElementCollection * Map<Address, PropertyInfo> parcels; * } * * @Embeddable public class PropertyInfo { * Integer parcelNumber; * Integer size; * BigDecimal tax; * } * * </pre> * * @see Embedded * @see Embeddable * @see MappedSuperclass * @see AssociationOverride * * @since Java Persistence 1.0 */ @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface AttributeOverride { /** * (Required) The name of the property whose mapping is being * overridden if property-based access is being used, or the * name of the field if field-based access is used. */ String name(); /** * (Required) The column that is being mapped to the persistent * attribute. The mapping type will remain the same as is * defined in the embeddable class or mapped superclass. */ Column column(); }