alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Hibernate example source code file (basic_mapping.pot)

This example Hibernate source code file (basic_mapping.pot) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - Hibernate tags/keywords

entity\n, hibernate, hibernate, in, it, sql, string, string, tag, tag, the, the, this, you

The Hibernate basic_mapping.pot source code

# SOME DESCRIPTIVE TITLE.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: http://bugs.kde.org\n"
"POT-Creation-Date: 2011-01-21 21:18+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <kde-i18n-doc@kde.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: application/x-xml2pot; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#. Tag: title
#: basic_mapping.xml:31
#, no-c-format
msgid "Basic O/R Mapping"
msgstr ""

#. Tag: title
#: basic_mapping.xml:34
#, no-c-format
msgid "Mapping declaration"
msgstr ""

#. Tag: para
#: basic_mapping.xml:36
#, no-c-format
msgid "Object/relational mappings can be defined in three approaches:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:41
#, no-c-format
msgid "using Java 5 annotations (via the Java Persistence 2 annotations)"
msgstr ""

#. Tag: para
#: basic_mapping.xml:46
#, no-c-format
msgid "using JPA 2 XML deployment descriptors (described in chapter XXX)"
msgstr ""

#. Tag: para
#: basic_mapping.xml:51
#, no-c-format
msgid "using the Hibernate legacy XML files approach known as hbm.xml"
msgstr ""

#. Tag: para
#: basic_mapping.xml:56
#, no-c-format
msgid "Annotations are split in two categories, the logical mapping annotations (describing the object model, the association between two entities etc.) and the physical mapping annotations (describing the physical schema, tables, columns, indexes, etc). We will mix annotations from both categories in the following code examples."
msgstr ""

#. Tag: para
#: basic_mapping.xml:62
#, no-c-format
msgid "JPA annotations are in the <literal>javax.persistence.* package. Hibernate specific extensions are in org.hibernate.annotations.*. You favorite IDE can auto-complete annotations and their attributes for you (even without a specific \"JPA\" plugin, since JPA annotations are plain Java 5 annotations)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:69
#, no-c-format
msgid "Here is an example of mapping"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:71
#, no-c-format
msgid ""
      "package eg;\n"
      "\n"
      "@Entity \n"
      "@Table(name=\"cats\") @Inheritance(strategy=SINGLE_TABLE)\n"
      "@DiscriminatorValue(\"C\") @DiscriminatorColumn(name=\"subclass\", discriminatorType=CHAR)\n"
      "public class Cat {\n"
      "   \n"
      "   @Id @GeneratedValue\n"
      "   public Integer getId() { return id; }\n"
      "   public void setId(Integer id) { this.id = id; }\n"
      "   private Integer id;\n"
      "\n"
      "   public BigDecimal getWeight() { return weight; }\n"
      "   public void setWeight(BigDecimal weight) { this.weight = weight; }\n"
      "   private BigDecimal weight;\n"
      "\n"
      "   @Temporal(DATE) @NotNull @Column(updatable=false)\n"
      "   public Date getBirthdate() { return birthdate; }\n"
      "   public void setBirthdate(Date birthdate) { this.birthdate = birthdate; }\n"
      "   private Date birthdate;\n"
      "\n"
      "   @org.hibernate.annotations.Type(type=\"eg.types.ColorUserType\")\n"
      "   @NotNull @Column(updatable=false)\n"
      "   public ColorType getColor() { return color; }\n"
      "   public void setColor(ColorType color) { this.color = color; }\n"
      "   private ColorType color;\n"
      "\n"
      "   @NotNull @Column(updatable=false)\n"
      "   public String getSex() { return sex; }\n"
      "   public void setSex(String sex) { this.sex = sex; }\n"
      "   private String sex;\n"
      "\n"
      "   @NotNull @Column(updatable=false)\n"
      "   public Integer getLitterId() { return litterId; }\n"
      "   public void setLitterId(Integer litterId) { this.litterId = litterId; }\n"
      "   private Integer litterId;\n"
      "\n"
      "   @ManyToOne @JoinColumn(name=\"mother_id\", updatable=false)\n"
      "   public Cat getMother() { return mother; }\n"
      "   public void setMother(Cat mother) { this.mother = mother; }\n"
      "   private Cat mother;\n"
      "\n"
      "   @OneToMany(mappedBy=\"mother\") @OrderBy(\"litterId\")\n"
      "   public Set<Cat> getKittens() { return kittens; }\n"
      "   public void setKittens(Set<Cat> kittens) { this.kittens = kittens; }\n"
      "   private Set<Cat> kittens = new HashSet<Cat>();\n"
      "}\n"
      "\n"
      "@Entity @DiscriminatorValue(\"D\")\n"
      "public class DomesticCat extends Cat {\n"
      "\n"
      "   public String getName() { return name; }\n"
      "   public void setName(String name) { this.name = name }\n"
      "   private String name;\n"
      "}\n"
      "\n"
      "@Entity\n"
      "public class Dog { ... }"
msgstr ""

#. Tag: para
#: basic_mapping.xml:73
#, no-c-format
msgid "The legacy hbm.xml approach uses an XML schema designed to be readable and hand-editable. The mapping language is Java-centric, meaning that mappings are constructed around persistent class declarations and not table declarations."
msgstr ""

#. Tag: para
#: basic_mapping.xml:78
#, no-c-format
msgid "Please note that even though many Hibernate users choose to write the XML by hand, a number of tools exist to generate the mapping document. These include XDoclet, Middlegen and AndroMDA."
msgstr ""

#. Tag: para
#: basic_mapping.xml:82
#, no-c-format
msgid "Here is an example mapping:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:84
#, no-c-format
msgid ""
      "<?xml version=\"1.0\"?>\n"
      "<!DOCTYPE hibernate-mapping PUBLIC\n"
      "      \"-//Hibernate/Hibernate Mapping DTD 3.0//EN\"\n"
      "          \"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd\">\n"
      "\n"
      "<hibernate-mapping package=\"eg\">\n"
      "\n"
      "        <class name=\"Cat\"\n"
      "            table=\"cats\"\n"
      "            discriminator-value=\"C\">\n"
      "\n"
      "                <id name=\"id\">\n"
      "                        <generator class=\"native\"/>\n"
      "                </id>\n"
      "\n"
      "                <discriminator column=\"subclass\"\n"
      "                     type=\"character\"/>\n"
      "\n"
      "                <property name=\"weight\"/>\n"
      "\n"
      "                <property name=\"birthdate\"\n"
      "                    type=\"date\"\n"
      "                    not-null=\"true\"\n"
      "                    update=\"false\"/>\n"
      "\n"
      "                <property name=\"color\"\n"
      "                    type=\"eg.types.ColorUserType\"\n"
      "                    not-null=\"true\"\n"
      "                    update=\"false\"/>\n"
      "\n"
      "                <property name=\"sex\"\n"
      "                    not-null=\"true\"\n"
      "                    update=\"false\"/>\n"
      "\n"
      "                <property name=\"litterId\"\n"
      "                    column=\"litterId\"\n"
      "                    update=\"false\"/>\n"
      "\n"
      "                <many-to-one name=\"mother\"\n"
      "                    column=\"mother_id\"\n"
      "                    update=\"false\"/>\n"
      "\n"
      "                <set name=\"kittens\"\n"
      "                    inverse=\"true\"\n"
      "                    order-by=\"litter_id\">\n"
      "                        <key column=\"mother_id\"/>\n"
      "                        <one-to-many class=\"Cat\"/>\n"
      "                </set>\n"
      "\n"
      "                <subclass name=\"DomesticCat\"\n"
      "                    discriminator-value=\"D\">\n"
      "\n"
      "                        <property name=\"name\"\n"
      "                            type=\"string\"/>\n"
      "\n"
      "                </subclass>\n"
      "\n"
      "        </class>\n"
      "\n"
      "        <class name=\"Dog\">\n"
      "                <!-- mapping for Dog could go here -->\n"
      "        </class>\n"
      "\n"
      "</hibernate-mapping>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:86
#, no-c-format
msgid "We will now discuss the concepts of the mapping documents (both annotations and XML). We will only describe, however, the document elements and attributes that are used by Hibernate at runtime. The mapping document also contains some extra optional attributes and elements that affect the database schemas exported by the schema export tool (for example, the <literal> not-null attribute)."
msgstr ""

#. Tag: title
#: basic_mapping.xml:94
#, no-c-format
msgid "Entity"
msgstr ""

#. Tag: para
#: basic_mapping.xml:96
#, no-c-format
msgid "An entity is a regular Java object (aka POJO) which will be persisted by Hibernate."
msgstr ""

#. Tag: para
#: basic_mapping.xml:99
#, no-c-format
msgid "To mark an object as an entity in annotations, use the <classname>@Entity annotation."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:102
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Flight implements Serializable {\n"
      "    Long id;\n"
      "\n"
      "    @Id\n"
      "    public Long getId() { return id; }\n"
      "\n"
      "    public void setId(Long id) { this.id = id; }\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:104
#, no-c-format
msgid "That's pretty much it, the rest is optional. There are however any options to tweak your entity mapping, let's explore them."
msgstr ""

#. Tag: para
#: basic_mapping.xml:107
#, no-c-format
msgid "<classname>@Table lets you define the table the entity will be persisted into. If undefined, the table name is the unqualified class name of the entity. You can also optionally define the catalog, the schema as well as unique constraints on the table."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:112
#, no-c-format
msgid ""
      "@Entity\n"
      "@Table(name=\"TBL_FLIGHT\", \n"
      "       schema=\"AIR_COMMAND\", \n"
      "       uniqueConstraints=\n"
      "           @UniqueConstraint(\n"
      "               name=\"flight_number\", \n"
      "               columnNames={\"comp_prefix\", \"flight_number\"} ) )\n"
      "public class Flight implements Serializable {\n"
      "    @Column(name=\"comp_prefix\")\n"
      "    public String getCompagnyPrefix() { return companyPrefix; }\n"
      "\n"
      "    @Column(name=\"flight_number\")\n"
      "    public String getNumber() { return number; }\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:114
#, no-c-format
msgid "The constraint name is optional (generated if left undefined). The column names composing the constraint correspond to the column names as defined before the Hibernate <classname>NamingStrategy is applied."
msgstr ""

#. Tag: para
#: basic_mapping.xml:119
#, no-c-format
msgid "<literal>@Entity.name lets you define the shortcut name of the entity you can used in JP-QL and HQL queries. It defaults to the unqualified class name of the class."
msgstr ""

#. Tag: para
#: basic_mapping.xml:123
#, no-c-format
msgid "Hibernate goes beyond the JPA specification and provide additional configurations. Some of them are hosted on <classname>@org.hibernate.annotations.Entity:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:129
#, no-c-format
msgid "<literal>dynamicInsert / dynamicUpdate (defaults to false): specifies that INSERT / UPDATE SQL should be generated at runtime and contain only the columns whose values are not null. The dynamic-update and dynamic-insert settings are not inherited by subclasses. Although these settings can increase performance in some cases, they can actually decrease performance in others."
msgstr ""

#. Tag: para
#: basic_mapping.xml:140
#, no-c-format
msgid "<literal>selectBeforeUpdate (defaults to false): specifies that Hibernate should never perform an SQL UPDATE unless it is certain that an object is actually modified. Only when a transient object has been associated with a new session using update(), will Hibernate perform an extra SQL SELECT to determine if an UPDATE is actually required. Use of select-before-update will usually decrease performance. It is useful to prevent a database update trigger being called unnecessarily if you reattach a graph of detached instances to a Session."
msgstr ""

#. Tag: para
#: basic_mapping.xml:154
#, no-c-format
msgid "<literal>polymorphisms (defaults to IMPLICIT): determines whether implicit or explicit query polymorphisms is used. Implicit polymorphisms means that instances of the class will be returned by a query that names any superclass or implemented interface or class, and that instances of any subclass of the class will be returned by a query that names the class itself. Explicit polymorphisms means that class instances will be returned only by queries that explicitly name that class. Queries that name the class will return only instances of subclasses mapped. For most purposes, the default polymorphisms=IMPLICIT is appropriate. Explicit polymorphisms is useful when two different classes are mapped to the same table This allows a \"lightweight\" class that contains a subset of the table columns."
msgstr ""

#. Tag: para
#: basic_mapping.xml:171
#, no-c-format
msgid "<literal>persister: specifies a custom ClassPersister. The persister attribute lets you customize the persistence strategy used for the class. You can, for example, specify your own subclass of org.hibernate.persister.EntityPersister, or you can even provide a completely new implementation of the interface org.hibernate.persister.ClassPersister that implements, for example, persistence via stored procedure calls, serialization to flat files or LDAP. See org.hibernate.test.CustomPersister for a simple example of \"persistence\" to a Hashtable."
msgstr ""

#. Tag: para
#: basic_mapping.xml:185
#, no-c-format
msgid "<literal>optimisticLock (defaults to VERSION): determines the optimistic locking strategy. If you enable dynamicUpdate, you will have a choice of optimistic locking strategies:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:192
#, no-c-format
msgid "<literal>version: check the version/timestamp columns"
msgstr ""

#. Tag: para
#: basic_mapping.xml:197
#, no-c-format
msgid "<literal>all: check all columns"
msgstr ""

#. Tag: para
#: basic_mapping.xml:201
#, no-c-format
msgid "<literal>dirty: check the changed columns, allowing some concurrent updates"
msgstr ""

#. Tag: para
#: basic_mapping.xml:206
#, no-c-format
msgid "<literal>none: do not use optimistic locking"
msgstr ""

#. Tag: para
#: basic_mapping.xml:211
#, no-c-format
msgid "It is <emphasis>strongly recommended that you use version/timestamp columns for optimistic locking with Hibernate. This strategy optimizes performance and correctly handles modifications made to detached instances (i.e. when Session.merge() is used)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:220
#, no-c-format
msgid "Be sure to import <classname>@javax.persistence.Entity to mark a class as an entity. It's a common mistake to import @org.hibernate.annotations.Entity by accident."
msgstr ""

#. Tag: para
#: basic_mapping.xml:227
#, no-c-format
msgid "Some entities are not mutable. They cannot be updated or deleted by the application. This allows Hibernate to make some minor performance optimizations.. Use the <classname>@Immutable annotation."
msgstr ""

#. Tag: para
#: basic_mapping.xml:232
#, no-c-format
msgid "You can also alter how Hibernate deals with lazy initialization for this class. On <classname>@Proxy, use lazy=false to disable lazy fetching (not recommended). You can also specify an interface to use for lazy initializing proxies (defaults to the class itself): use proxyClass on @Proxy. Hibernate will initially return proxies (Javassist or CGLIB) that implement the named interface. The persistent object will load when a method of the proxy is invoked. See \"Initializing collections and proxies\" below."
msgstr ""

#. Tag: para
#: basic_mapping.xml:243
#, no-c-format
msgid "<classname>@BatchSize specifies a \"batch size\" for fetching instances of this class by identifier. Not yet loaded instances are loaded batch-size at a time (default 1)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:247
#, no-c-format
msgid "You can specific an arbitrary SQL WHERE condition to be used when retrieving objects of this class. Use <classname>@Where for that."
msgstr ""

#. Tag: para
#: basic_mapping.xml:251
#, no-c-format
msgid "In the same vein, <classname>@Check lets you define an SQL expression used to generate a multi-row check constraint for automatic schema generation."
msgstr ""

#. Tag: para
#: basic_mapping.xml:255
#, no-c-format
msgid "There is no difference between a view and a base table for a Hibernate mapping. This is transparent at the database level, although some DBMS do not support views properly, especially with updates. Sometimes you want to use a view, but you cannot create one in the database (i.e. with a legacy schema). In this case, you can map an immutable and read-only entity to a given SQL subselect expression using <classname>@org.hibernate.annotations.Subselect:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:263
#, no-c-format
msgid ""
      "@Entity\n"
      "@Subselect(\"select item.name, max(bid.amount), count(*) \"\n"
      "        + \"from item \"\n"
      "        + \"join bid on bid.item_id = item.id \"\n"
      "        + \"group by item.name\")\n"
      "@Synchronize( {\"item\", \"bid\"} ) //tables impacted\n"
      "public class Summary {\n"
      "    @Id\n"
      "    public String getId() { return id; }\n"
      "    ...\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:265
#, no-c-format
msgid "Declare the tables to synchronize this entity with, ensuring that auto-flush happens correctly and that queries against the derived entity do not return stale data. The <literal><subselect> is available both as an attribute and a nested mapping element."
msgstr ""

#. Tag: para
#: basic_mapping.xml:270
#, no-c-format
msgid "We will now explore the same options using the hbm.xml structure. You can declare a persistent class using the <literal>class element. For example:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:319
#, no-c-format
msgid ""
      "<class\n"
      "        name=\"ClassName\"\n"
      "        table=\"tableName\"\n"
      "        discriminator-value=\"discriminator_value\"\n"
      "        mutable=\"true|false\"\n"
      "        schema=\"owner\"\n"
      "        catalog=\"catalog\"\n"
      "        proxy=\"ProxyInterface\"\n"
      "        dynamic-update=\"true|false\"\n"
      "        dynamic-insert=\"true|false\"\n"
      "        select-before-update=\"true|false\"\n"
      "        polymorphism=\"implicit|explicit\"\n"
      "        where=\"arbitrary sql where condition\"\n"
      "        persister=\"PersisterClass\"\n"
      "        batch-size=\"N\"\n"
      "        optimistic-lock=\"none|version|dirty|all\"\n"
      "        lazy=\"true|false\"\n"
      "        entity-name=\"EntityName\"\n"
      "        check=\"arbitrary sql check condition\"\n"
      "        rowid=\"rowid\"\n"
      "        subselect=\"SQL expression\"\n"
      "        abstract=\"true|false\"\n"
      "        node=\"element-name\"\n"
      "/>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:323
#, no-c-format
msgid "<literal>name (optional): the fully qualified Java class name of the persistent class or interface. If this attribute is missing, it is assumed that the mapping is for a non-POJO entity."
msgstr ""

#. Tag: para
#: basic_mapping.xml:330
#, no-c-format
msgid "<literal>table (optional - defaults to the unqualified class name): the name of its database table."
msgstr ""

#. Tag: para
#: basic_mapping.xml:335
#, no-c-format
msgid "<literal>discriminator-value (optional - defaults to the class name): a value that distinguishes individual subclasses that is used for polymorphic behavior. Acceptable values include null and not null."
msgstr ""

#. Tag: para
#: basic_mapping.xml:343
#, no-c-format
msgid "<literal>mutable (optional - defaults to true): specifies that instances of the class are (not) mutable."
msgstr ""

#. Tag: para
#: basic_mapping.xml:349 basic_mapping.xml:2948
#, no-c-format
msgid "<literal>schema (optional): overrides the schema name specified by the root <hibernate-mapping> element."
msgstr ""

#. Tag: para
#: basic_mapping.xml:355 basic_mapping.xml:2954
#, no-c-format
msgid "<literal>catalog (optional): overrides the catalog name specified by the root <hibernate-mapping> element."
msgstr ""

#. Tag: para
#: basic_mapping.xml:361
#, no-c-format
msgid "<literal>proxy (optional): specifies an interface to use for lazy initializing proxies. You can specify the name of the class itself."
msgstr ""

#. Tag: para
#: basic_mapping.xml:367
#, no-c-format
msgid "<literal>dynamic-update (optional - defaults to false): specifies that UPDATE SQL should be generated at runtime and can contain only those columns whose values have changed."
msgstr ""

#. Tag: para
#: basic_mapping.xml:374
#, no-c-format
msgid "<literal>dynamic-insert (optional - defaults to false): specifies that INSERT SQL should be generated at runtime and contain only the columns whose values are not null."
msgstr ""

#. Tag: para
#: basic_mapping.xml:381
#, no-c-format
msgid "<literal>select-before-update (optional - defaults to false): specifies that Hibernate should never perform an SQL UPDATE unless it is certain that an object is actually modified. Only when a transient object has been associated with a new session using update(), will Hibernate perform an extra SQL SELECT to determine if an UPDATE is actually required."
msgstr ""

#. Tag: para
#: basic_mapping.xml:393
#, no-c-format
msgid "<literal>polymorphisms (optional - defaults to implicit): determines whether implicit or explicit query polymorphisms is used."
msgstr ""

#. Tag: para
#: basic_mapping.xml:399
#, no-c-format
msgid "<literal>where (optional): specifies an arbitrary SQL WHERE condition to be used when retrieving objects of this class."
msgstr ""

#. Tag: para
#: basic_mapping.xml:405
#, no-c-format
msgid "<literal>persister (optional): specifies a custom ClassPersister."
msgstr ""

#. Tag: para
#: basic_mapping.xml:410
#, no-c-format
msgid "<literal>batch-size (optional - defaults to 1): specifies a \"batch size\" for fetching instances of this class by identifier."
msgstr ""

#. Tag: para
#: basic_mapping.xml:416
#, no-c-format
msgid "<literal>optimistic-lock (optional - defaults to version): determines the optimistic locking strategy."
msgstr ""

#. Tag: para
#: basic_mapping.xml:422
#, no-c-format
msgid "<literal>lazy (optional): lazy fetching can be disabled by setting lazy=\"false\"."
msgstr ""

#. Tag: para
#: basic_mapping.xml:427
#, no-c-format
msgid "<literal>entity-name (optional - defaults to the class name): Hibernate3 allows a class to be mapped multiple times, potentially to different tables. It also allows entity mappings that are represented by Maps or XML at the Java level. In these cases, you should provide an explicit arbitrary name for the entity. See  and  for more information."
msgstr ""

#. Tag: para
#: basic_mapping.xml:437
#, no-c-format
msgid "<literal>check (optional): an SQL expression used to generate a multi-row check constraint for automatic schema generation."
msgstr ""

#. Tag: para
#: basic_mapping.xml:443
#, no-c-format
msgid "<literal>rowid (optional): Hibernate can use ROWIDs on databases. On Oracle, for example, Hibernate can use the rowid extra column for fast updates once this option has been set to rowid. A ROWID is an implementation detail and represents the physical location of a stored tuple."
msgstr ""

#. Tag: para
#: basic_mapping.xml:452
#, no-c-format
msgid "<literal>subselect (optional): maps an immutable and read-only entity to a database subselect. This is useful if you want to have a view instead of a base table. See below for more information."
msgstr ""

#. Tag: para
#: basic_mapping.xml:459
#, no-c-format
msgid "<literal>abstract (optional): is used to mark abstract superclasses in <union-subclass> hierarchies."
msgstr ""

#. Tag: para
#: basic_mapping.xml:466
#, no-c-format
msgid "It is acceptable for the named persistent class to be an interface. You can declare implementing classes of that interface using the <literal><subclass> element. You can persist any static inner class. Specify the class name using the standard form i.e. e.g.Foo$Bar."
msgstr ""

#. Tag: para
#: basic_mapping.xml:472
#, no-c-format
msgid "Here is how to do a virtual view (subselect) in XML:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:474
#, no-c-format
msgid ""
      "<class name=\"Summary\">\n"
      "    <subselect>\n"
      "        select item.name, max(bid.amount), count(*)\n"
      "        from item\n"
      "        join bid on bid.item_id = item.id\n"
      "        group by item.name\n"
      "    </subselect>\n"
      "    <synchronize table=\"item\"/>\n"
      "    <synchronize table=\"bid\"/>\n"
      "    <id name=\"name\"/>\n"
      "    ...\n"
      "</class>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:476
#, no-c-format
msgid "The <literal><subselect> is available both as an attribute and a nested mapping element."
msgstr ""

#. Tag: title
#: basic_mapping.xml:481
#, no-c-format
msgid "Identifiers"
msgstr ""

#. Tag: para
#: basic_mapping.xml:483
#, no-c-format
msgid "Mapped classes <emphasis>must declare the primary key column of the database table. Most classes will also have a JavaBeans-style property holding the unique identifier of an instance."
msgstr ""

#. Tag: para
#: basic_mapping.xml:488
#, no-c-format
msgid "Mark the identifier property with <classname>@Id."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:491
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Person {\n"
      "   @Id Integer getId() { ... }\n"
      "   ...\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:493
#, no-c-format
msgid "In hbm.xml, use the <literal><id> element which defines the mapping from that property to the primary key column."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:509
#, no-c-format
msgid ""
      "<id\n"
      "        name=\"propertyName\"\n"
      "        type=\"typename\"\n"
      "        column=\"column_name\"\n"
      "        unsaved-value=\"null|any|none|undefined|id_value\"\n"
      "        access=\"field|property|ClassName\">\n"
      "        node=\"element-name|@attribute-name|element/@attribute|.\"\n"
      "\n"
      "        <generator class=\"generatorClass\"/>\n"
      "</id>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:513
#, no-c-format
msgid "<literal>name (optional): the name of the identifier property."
msgstr ""

#. Tag: para
#: basic_mapping.xml:518 basic_mapping.xml:2152
#, no-c-format
msgid "<literal>type (optional): a name that indicates the Hibernate type."
msgstr ""

#. Tag: para
#: basic_mapping.xml:523
#, no-c-format
msgid "<literal>column (optional - defaults to the property name): the name of the primary key column."
msgstr ""

#. Tag: para
#: basic_mapping.xml:528
#, no-c-format
msgid "<literal>unsaved-value (optional - defaults to a \"sensible\" value): an identifier property value that indicates an instance is newly instantiated (unsaved), distinguishing it from detached instances that were saved or loaded in a previous session."
msgstr ""

#. Tag: para
#: basic_mapping.xml:536
#, no-c-format
msgid "<literal>access (optional - defaults to property): the strategy Hibernate should use for accessing the property value."
msgstr ""

#. Tag: para
#: basic_mapping.xml:543
#, no-c-format
msgid "If the <literal>name attribute is missing, it is assumed that the class has no identifier property."
msgstr ""

#. Tag: para
#: basic_mapping.xml:546
#, no-c-format
msgid "The <literal>unsaved-value attribute is almost never needed in Hibernate3 and indeed has no corresponding element in annotations."
msgstr ""

#. Tag: para
#: basic_mapping.xml:550
#, no-c-format
msgid "You can also declare the identifier as a composite identifier. This allows access to legacy data with composite keys. Its use is strongly discouraged for anything else."
msgstr ""

#. Tag: title
#: basic_mapping.xml:555
#, no-c-format
msgid "Composite identifier"
msgstr ""

#. Tag: para
#: basic_mapping.xml:557
#, no-c-format
msgid "You can define a composite primary key through several syntaxes:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:562
#, no-c-format
msgid "use a component type to represent the identifier and map it as a property in the entity: you then annotated the property as <classname>@EmbeddedId. The component type has to be Serializable."
msgstr ""

#. Tag: para
#: basic_mapping.xml:569
#, no-c-format
msgid "map multiple properties as <classname>@Id properties: the identifier type is then the entity class itself and needs to be Serializable. This approach is unfortunately not standard and only supported by Hibernate."
msgstr ""

#. Tag: para
#: basic_mapping.xml:577
#, no-c-format
msgid "map multiple properties as <classname>@Id properties and declare an external class to be the identifier type. This class, which needs to be Serializable, is declared on the entity via the @IdClass annotation. The identifier type must contain the same properties as the identifier properties of the entity: each property name must be the same, its type must be the same as well if the entity property is of a basic type, its type must be the type of the primary key of the associated entity if the entity property is an association (either a @OneToOne or a @ManyToOne)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:592
#, no-c-format
msgid "As you can see the last case is far from obvious. It has been inherited from the dark ages of EJB 2 for backward compatibilities and we recommend you not to use it (for simplicity sake)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:596
#, no-c-format
msgid "Let's explore all three cases using examples."
msgstr ""

#. Tag: title
#: basic_mapping.xml:599
#, no-c-format
msgid "id as a property using a component type"
msgstr ""

#. Tag: para
#: basic_mapping.xml:601
#, no-c-format
msgid "Here is a simple example of <classname>@EmbeddedId."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:604
#, no-c-format
msgid ""
      "@Entity\n"
      "class User {\n"
      "   @EmbeddedId\n"
      "   @AttributeOverride(name=\"firstName\", column=@Column(name=\"fld_firstname\")\n"
      "   UserId id;\n"
      "\n"
      "   Integer age;\n"
      "}\n"
      "\n"
      "@Embeddable\n"
      "class UserId implements Serializable {\n"
      "   String firstName;\n"
      "   String lastName;\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:606
#, no-c-format
msgid "You can notice that the <classname>UserId class is serializable. To override the column mapping, use @AttributeOverride."
msgstr ""

#. Tag: para
#: basic_mapping.xml:610
#, no-c-format
msgid "An embedded id can itself contains the primary key of an associated entity."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:613
#, no-c-format
msgid ""
      "@Entity\n"
      "class Customer {\n"
      "   @EmbeddedId CustomerId id;\n"
      "   boolean preferredCustomer;\n"
      "\n"
      "   @MapsId(\"userId\")\n"
      "   @JoinColumns({\n"
      "      @JoinColumn(name=\"userfirstname_fk\", referencedColumnName=\"firstName\"),\n"
      "      @JoinColumn(name=\"userlastname_fk\", referencedColumnName=\"lastName\")\n"
      "   })\n"
      "   @OneToOne User user;\n"
      "}\n"
      "\n"
      "@Embeddable\n"
      "class CustomerId implements Serializable {\n"
      "   UserId userId;\n"
      "   String customerNumber;\n"
      "\n"
      "   //implements equals and hashCode\n"
      "}\n"
      "\n"
      "@Entity \n"
      "class User {\n"
      "   @EmbeddedId UserId id;\n"
      "   Integer age;\n"
      "}\n"
      "\n"
      "@Embeddable\n"
      "class UserId implements Serializable {\n"
      "   String firstName;\n"
      "   String lastName;\n"
      "\n"
      "   //implements equals and hashCode\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:615
#, no-c-format
msgid "In the embedded id object, the association is represented as the identifier of the associated entity. But you can link its value to a regular association in the entity via the <classname>@MapsId annotation. The @MapsId value correspond to the property name of the embedded id object containing the associated entity's identifier. In the database, it means that the Customer.user and the CustomerId.userId properties share the same underlying column (user_fk in this case)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:627
#, no-c-format
msgid "The component type used as identifier must implement <methodname>equals() and hashCode()."
msgstr ""

#. Tag: para
#: basic_mapping.xml:632
#, no-c-format
msgid "In practice, your code only sets the <literal>Customer.user property and the user id value is copied by Hibernate into the CustomerId.userId property."
msgstr ""

#. Tag: para
#: basic_mapping.xml:638
#, no-c-format
msgid "The id value can be copied as late as flush time, don't rely on it until after flush time."
msgstr ""

#. Tag: para
#: basic_mapping.xml:642
#, no-c-format
msgid "While not supported in JPA, Hibernate lets you place your association directly in the embedded id component (instead of having to use the <classname>@MapsId annotation)."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:646
#, no-c-format
msgid ""
      "@Entity\n"
      "class Customer {\n"
      "   @EmbeddedId CustomerId id;\n"
      "   boolean preferredCustomer;\n"
      "}\n"
      "\n"
      "@Embeddable\n"
      "class CustomerId implements Serializable {\n"
      "   @OneToOne\n"
      "   @JoinColumns({\n"
      "      @JoinColumn(name=\"userfirstname_fk\", referencedColumnName=\"firstName\"),\n"
      "      @JoinColumn(name=\"userlastname_fk\", referencedColumnName=\"lastName\")\n"
      "   }) \n"
      "   User user;\n"
      "   String customerNumber;\n"
      "\n"
      "   //implements equals and hashCode\n"
      "}\n"
      "\n"
      "@Entity \n"
      "class User {\n"
      "   @EmbeddedId UserId id;\n"
      "   Integer age;\n"
      "}\n"
      "\n"
      "@Embeddable\n"
      "class UserId implements Serializable {\n"
      "   String firstName;\n"
      "   String lastName;\n"
      "\n"
      "\n"
      "   //implements equals and hashCode\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:648
#, no-c-format
msgid "Let's now rewrite these examples using the hbm.xml syntax."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:651
#, no-c-format
msgid ""
      "<composite-id\n"
      "        name=\"propertyName\"\n"
      "        class=\"ClassName\"\n"
      "        mapped=\"true|false\"\n"
      "        access=\"field|property|ClassName\"\n"
      "        node=\"element-name|.\">\n"
      "\n"
      "        <key-property name=\"propertyName\" type=\"typename\" column=\"column_name\"/>\n"
      "        <key-many-to-one name=\"propertyName\" class=\"ClassName\" column=\"column_name\"/>\n"
      "        ......\n"
      "</composite-id>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:653
#, no-c-format
msgid "First a simple example:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:655
#, no-c-format
msgid ""
      "<class name=\"User\">\n"
      "   <composite-id name=\"id\" class=\"UserId\">\n"
      "      <key-property name=\"firstName\" column=\"fld_firstname\"/>\n"
      "      <key-property name=\"lastName\"/>\n"
      "   </composite-id>\n"
      "</class>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:657
#, no-c-format
msgid "Then an example showing how an association can be mapped."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:660
#, no-c-format
msgid ""
      "<class name=\"Customer\">\n"
      "   <composite-id name=\"id\" class=\"CustomerId\">\n"
      "      <key-property name=\"firstName\" column=\"userfirstname_fk\"/>\n"
      "      <key-property name=\"lastName\" column=\"userfirstname_fk\"/>\n"
      "      <key-property name=\"customerNumber\"/>\n"
      "   </composite-id>\n"
      "\n"
      "   <property name=\"preferredCustomer\"/>\n"
      "\n"
      "   <many-to-one name=\"user\">\n"
      "      <column name=\"userfirstname_fk\" updatable=\"false\" insertable=\"false\"/>\n"
      "      <column name=\"userlastname_fk\" updatable=\"false\" insertable=\"false\"/>\n"
      "   </many-to-one>\n"
      "</class>\n"
      "\n"
      "<class name=\"User\">\n"
      "   <composite-id name=\"id\" class=\"UserId\">\n"
      "      <key-property name=\"firstName\"/>\n"
      "      <key-property name=\"lastName\"/>\n"
      "   </composite-id>\n"
      "\n"
      "   <property name=\"age\"/>\n"
      "</class>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:662
#, no-c-format
msgid "Notice a few things in the previous example:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:666
#, no-c-format
msgid "the order of the properties (and column) matters. It must be the same between the association and the primary key of the associated entity"
msgstr ""

#. Tag: para
#: basic_mapping.xml:672
#, no-c-format
msgid "the many to one uses the same columns as the primary key and thus must be marked as read only (<literal>insertable and updatable to false)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:679
#, no-c-format
msgid "unlike with <classname>@MapsId, the id value of the associated entity is not transparently copied, check the foreign id generator for more information."
msgstr ""

#. Tag: para
#: basic_mapping.xml:686
#, no-c-format
msgid "The last example shows how to map association directly in the embedded id component."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:689
#, no-c-format
msgid ""
      "<class name=\"Customer\">\n"
      "   <composite-id name=\"id\" class=\"CustomerId\">\n"
      "      <key-many-to-one name=\"user\">\n"
      "         <column name=\"userfirstname_fk\"/>\n"
      "         <column name=\"userlastname_fk\"/>\n"
      "      </key-many-to-one>\n"
      "      <key-property name=\"customerNumber\"/>\n"
      "   </composite-id>\n"
      "\n"
      "   <property name=\"preferredCustomer\"/>\n"
      "</class>\n"
      "\n"
      "<class name=\"User\">\n"
      "   <composite-id name=\"id\" class=\"UserId\">\n"
      "      <key-property name=\"firstName\"/>\n"
      "      <key-property name=\"lastName\"/>\n"
      "   </composite-id>\n"
      "\n"
      "   <property name=\"age\"/>\n"
      "</class>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:691
#, no-c-format
msgid "This is the recommended approach to map composite identifier. The following options should not be considered unless some constraint are present."
msgstr ""

#. Tag: title
#: basic_mapping.xml:697
#, no-c-format
msgid "Multiple id properties without identifier type"
msgstr ""

#. Tag: para
#: basic_mapping.xml:699
#, no-c-format
msgid "Another, arguably more natural, approach is to place <classname>@Id on multiple properties of your entity. This approach is only supported by Hibernate (not JPA compliant) but does not require an extra embeddable component."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:704
#, no-c-format
msgid ""
      "@Entity\n"
      "class Customer implements Serializable {\n"
      "   @Id @OneToOne\n"
      "   @JoinColumns({\n"
      "      @JoinColumn(name=\"userfirstname_fk\", referencedColumnName=\"firstName\"),\n"
      "      @JoinColumn(name=\"userlastname_fk\", referencedColumnName=\"lastName\")\n"
      "   })\n"
      "   User user;\n"
      "  \n"
      "   @Id String customerNumber;\n"
      "\n"
      "   boolean preferredCustomer;\n"
      "\n"
      "   //implements equals and hashCode\n"
      "}\n"
      "\n"
      "@Entity \n"
      "class User {\n"
      "   @EmbeddedId UserId id;\n"
      "   Integer age;\n"
      "}\n"
      "\n"
      "@Embeddable\n"
      "class UserId implements Serializable {\n"
      "   String firstName;\n"
      "   String lastName;\n"
      "\n"
      "   //implements equals and hashCode\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:706
#, no-c-format
msgid "In this case <classname>Customer is its own identifier representation: it must implement Serializable and must implement equals() and hashCode()."
msgstr ""

#. Tag: para
#: basic_mapping.xml:712
#, no-c-format
msgid "In hbm.xml, the same mapping is:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:714
#, no-c-format
msgid ""
      "<class name=\"Customer\">\n"
      "   <composite-id>\n"
      "      <key-many-to-one name=\"user\">\n"
      "         <column name=\"userfirstname_fk\"/>\n"
      "         <column name=\"userlastname_fk\"/>\n"
      "      </key-many-to-one>\n"
      "      <key-property name=\"customerNumber\"/>\n"
      "   </composite-id>\n"
      "\n"
      "   <property name=\"preferredCustomer\"/>\n"
      "</class>\n"
      "\n"
      "<class name=\"User\">\n"
      "   <composite-id name=\"id\" class=\"UserId\">\n"
      "      <key-property name=\"firstName\"/>\n"
      "      <key-property name=\"lastName\"/>\n"
      "   </composite-id>\n"
      "\n"
      "   <property name=\"age\"/>\n"
      "</class>"
msgstr ""

#. Tag: title
#: basic_mapping.xml:718
#, no-c-format
msgid "Multiple id properties with with a dedicated identifier type"
msgstr ""

#. Tag: para
#: basic_mapping.xml:721
#, no-c-format
msgid "<classname>@IdClass on an entity points to the class (component) representing the identifier of the class. The properties marked @Id on the entity must have their corresponding property on the @IdClass. The return type of search twin property must be either identical for basic properties or must correspond to the identifier class of the associated entity for an association."
msgstr ""

#. Tag: para
#: basic_mapping.xml:730
#, no-c-format
msgid "This approach is inherited from the EJB 2 days and we recommend against its use. But, after all it's your application and Hibernate supports it."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:735
#, no-c-format
msgid ""
      "@Entity\n"
      "@IdClass(CustomerId.class)\n"
      "class Customer implements Serializable {\n"
      "   @Id @OneToOne\n"
      "   @JoinColumns({\n"
      "      @JoinColumn(name=\"userfirstname_fk\", referencedColumnName=\"firstName\"),\n"
      "      @JoinColumn(name=\"userlastname_fk\", referencedColumnName=\"lastName\")\n"
      "   }) \n"
      "   User user;\n"
      "  \n"
      "   @Id String customerNumber;\n"
      "\n"
      "   boolean preferredCustomer;\n"
      "}\n"
      "\n"
      "class CustomerId implements Serializable {\n"
      "   UserId user;\n"
      "   String customerNumber;\n"
      "\n"
      "   //implements equals and hashCode\n"
      "}\n"
      "\n"
      "@Entity \n"
      "class User {\n"
      "   @EmbeddedId UserId id;\n"
      "   Integer age;\n"
      "\n"
      "   //implements equals and hashCode\n"
      "}\n"
      "\n"
      "@Embeddable\n"
      "class UserId implements Serializable {\n"
      "   String firstName;\n"
      "   String lastName;\n"
      "\n"
      "   //implements equals and hashCode\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:737
#, no-c-format
msgid "<classname>Customer and CustomerId do have the same properties customerNumber as well as user. CustomerId must be Serializable and implement equals() and hashCode()."
msgstr ""

#. Tag: para
#: basic_mapping.xml:745
#, no-c-format
msgid "While not JPA standard, Hibernate let's you declare the vanilla associated property in the <classname>@IdClass."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:749
#, no-c-format
msgid ""
      "@Entity\n"
      "@IdClass(CustomerId.class)\n"
      "class Customer implements Serializable {\n"
      "   @Id @OneToOne\n"
      "   @JoinColumns({\n"
      "      @JoinColumn(name=\"userfirstname_fk\", referencedColumnName=\"firstName\"),\n"
      "      @JoinColumn(name=\"userlastname_fk\", referencedColumnName=\"lastName\")\n"
      "   }) \n"
      "   User user;\n"
      "  \n"
      "   @Id String customerNumber;\n"
      "\n"
      "   boolean preferredCustomer;\n"
      "}\n"
      "\n"
      "class CustomerId implements Serializable {\n"
      "   @OneToOne User user;\n"
      "   String customerNumber;\n"
      "\n"
      "   //implements equals and hashCode\n"
      "}\n"
      "\n"
      "@Entity \n"
      "class User {\n"
      "   @EmbeddedId UserId id;\n"
      "   Integer age;\n"
      "\n"
      "   //implements equals and hashCode\n"
      "}\n"
      "\n"
      "@Embeddable\n"
      "class UserId implements Serializable {\n"
      "  String firstName;\n"
      "  String lastName;\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:751
#, no-c-format
msgid "This feature is of limited interest though as you are likely to have chosen the <classname>@IdClass approach to stay JPA compliant or you have a quite twisted mind."
msgstr ""

#. Tag: para
#: basic_mapping.xml:755
#, no-c-format
msgid "Here are the equivalent on hbm.xml files:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:757
#, no-c-format
msgid ""
      "<class name=\"Customer\">\n"
      "   <composite-id class=\"CustomerId\" mapped=\"true\">\n"
      "      <key-many-to-one name=\"user\">\n"
      "         <column name=\"userfirstname_fk\"/>\n"
      "         <column name=\"userlastname_fk\"/>\n"
      "      </key-many-to-one>\n"
      "      <key-property name=\"customerNumber\"/>\n"
      "   </composite-id>\n"
      "\n"
      "   <property name=\"preferredCustomer\"/>\n"
      "</class>\n"
      "\n"
      "<class name=\"User\">\n"
      "   <composite-id name=\"id\" class=\"UserId\">\n"
      "      <key-property name=\"firstName\"/>\n"
      "      <key-property name=\"lastName\"/>\n"
      "   </composite-id>\n"
      "\n"
      "   <property name=\"age\"/>\n"
      "</class>"
msgstr ""

#. Tag: title
#: basic_mapping.xml:762
#, no-c-format
msgid "Identifier generator"
msgstr ""

#. Tag: para
#: basic_mapping.xml:764
#, no-c-format
msgid "Hibernate can generate and populate identifier values for you automatically. This is the recommended approach over \"business\" or \"natural\" id (especially composite ids)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:768
#, no-c-format
msgid "Hibernate offers various generation strategies, let's explore the most common ones first that happens to be standardized by JPA:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:774
#, no-c-format
msgid "IDENTITY: supports identity columns in DB2, MySQL, MS SQL Server, Sybase and HypersonicSQL. The returned identifier is of type <literal>long, short or int."
msgstr ""

#. Tag: para
#: basic_mapping.xml:781
#, no-c-format
msgid "SEQUENCE (called <literal>seqhilo in Hibernate): uses a hi/lo algorithm to efficiently generate identifiers of type long, short or int, given a named database sequence."
msgstr ""

#. Tag: para
#: basic_mapping.xml:788
#, no-c-format
msgid "TABLE (called <classname>MultipleHiLoPerTableGenerator in Hibernate) : uses a hi/lo algorithm to efficiently generate identifiers of type long, short or int, given a table and column as a source of hi values. The hi/lo algorithm generates identifiers that are unique only for a particular database."
msgstr ""

#. Tag: para
#: basic_mapping.xml:798
#, no-c-format
msgid "AUTO: selects <literal>IDENTITY, SEQUENCE or TABLE depending upon the capabilities of the underlying database."
msgstr ""

#. Tag: para
#: basic_mapping.xml:805
#, no-c-format
msgid "We recommend all new projects to use the new enhanced identifier generators. They are deactivated by default for entities using annotations but can be activated using <code>hibernate.id.new_generator_mappings=true. These new generators are more efficient and closer to the JPA 2 specification semantic."
msgstr ""

#. Tag: para
#: basic_mapping.xml:812
#, no-c-format
msgid "However they are not backward compatible with existing Hibernate based application (if a sequence or a table is used for id generation). See XXXXXXX <xref linkend=\"ann-setup-properties\"/> for more information on how to activate them."
msgstr ""

#. Tag: para
#: basic_mapping.xml:818
#, no-c-format
msgid "To mark an id property as generated, use the <classname>@GeneratedValue annotation. You can specify the strategy used (default to AUTO) by setting strategy."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:823
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Customer {\n"
      "   @Id @GeneratedValue\n"
      "   Integer getId() { ... };\n"
      "}\n"
      "\n"
      "@Entity \n"
      "public class Invoice {\n"
      "   @Id @GeneratedValue(strategy=GenerationType.IDENTITY)\n"
      "   Integer getId() { ... };\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:825
#, no-c-format
msgid "<literal>SEQUENCE and TABLE require additional configurations that you can set using @SequenceGenerator and @TableGenerator:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:832
#, no-c-format
msgid "<literal>name: name of the generator"
msgstr ""

#. Tag: para
#: basic_mapping.xml:836
#, no-c-format
msgid "<literal>table / sequenceName: name of the table or the sequence (defaulting respectively to hibernate_sequences and hibernate_sequence)"
msgstr ""

#. Tag: para
#: basic_mapping.xml:843
#, no-c-format
msgid "<literal>catalog / schema:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:848
#, no-c-format
msgid "<literal>initialValue: the value from which the id is to start generating"
msgstr ""

#. Tag: para
#: basic_mapping.xml:853
#, no-c-format
msgid "<literal>allocationSize: the amount to increment by when allocating id numbers from the generator"
msgstr ""

#. Tag: para
#: basic_mapping.xml:858
#, no-c-format
msgid "In addition, the <classname>TABLE strategy also let you customize:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:863
#, no-c-format
msgid "<literal>pkColumnName: the column name containing the entity identifier"
msgstr ""

#. Tag: para
#: basic_mapping.xml:868
#, no-c-format
msgid "<literal>valueColumnName: the column name containing the identifier value"
msgstr ""

#. Tag: para
#: basic_mapping.xml:873
#, no-c-format
msgid "<literal>pkColumnValue: the entity identifier"
msgstr ""

#. Tag: para
#: basic_mapping.xml:878
#, no-c-format
msgid "<literal>uniqueConstraints: any potential column constraint on the table containing the ids"
msgstr ""

#. Tag: para
#: basic_mapping.xml:883
#, no-c-format
msgid "To link a table or sequence generator definition with an actual generated property, use the same name in both the definition <literal>name and the generator value generator as shown below."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:888
#, no-c-format
msgid ""
      "@Id \n"
      "@GeneratedValue(\n"
      "    strategy=GenerationType.SEQUENCE, \n"
      "    generator=\"SEQ_GEN\")\n"
      "@javax.persistence.SequenceGenerator(\n"
      "    name=\"SEQ_GEN\",\n"
      "    sequenceName=\"my_sequence\",\n"
      "    allocationSize=20\n"
      ")\n"
      "public Integer getId() { ... }"
msgstr ""

#. Tag: para
#: basic_mapping.xml:890
#, no-c-format
msgid "The scope of a generator definition can be the application or the class. Class-defined generators are not visible outside the class and can override application level generators. Application level generators are defined in JPA's XML deployment descriptors (see XXXXXX <xref linkend=\"xml-overriding\"/>):"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:896
#, no-c-format
msgid ""
      "<table-generator name=\"EMP_GEN\"\n"
      "            table=\"GENERATOR_TABLE\"\n"
      "            pk-column-name=\"key\"\n"
      "            value-column-name=\"hi\"\n"
      "            pk-column-value=\"EMP\"\n"
      "            allocation-size=\"20\"/>\n"
      "\n"
      "//and the annotation equivalent\n"
      "\n"
      "@javax.persistence.TableGenerator(\n"
      "    name=\"EMP_GEN\",\n"
      "    table=\"GENERATOR_TABLE\",\n"
      "    pkColumnName = \"key\",\n"
      "    valueColumnName = \"hi\"\n"
      "    pkColumnValue=\"EMP\",\n"
      "    allocationSize=20\n"
      ")\n"
      "\n"
      "<sequence-generator name=\"SEQ_GEN\" \n"
      "    sequence-name=\"my_sequence\"\n"
      "    allocation-size=\"20\"/>\n"
      "\n"
      "//and the annotation equivalent\n"
      "\n"
      "@javax.persistence.SequenceGenerator(\n"
      "    name=\"SEQ_GEN\",\n"
      "    sequenceName=\"my_sequence\",\n"
      "    allocationSize=20\n"
      ")"
msgstr ""

#. Tag: para
#: basic_mapping.xml:898
#, no-c-format
msgid "If a JPA XML descriptor (like <filename>META-INF/orm.xml) is used to define the generators, EMP_GEN and SEQ_GEN are application level generators."
msgstr ""

#. Tag: para
#: basic_mapping.xml:904
#, no-c-format
msgid "Package level definition is not supported by the JPA specification. However, you can use the <literal>@GenericGenerator at the package level (see )."
msgstr ""

#. Tag: para
#: basic_mapping.xml:910
#, no-c-format
msgid "These are the four standard JPA generators. Hibernate goes beyond that and provide additional generators or additional options as we will see below. You can also write your own custom identifier generator by implementing <classname>org.hibernate.id.IdentifierGenerator."
msgstr ""

#. Tag: para
#: basic_mapping.xml:916
#, no-c-format
msgid "To define a custom generator, use the <classname>@GenericGenerator annotation (and its plural counter part @GenericGenerators) that describes the class of the identifier generator or its short cut name (as described below) and a list of key/value parameters. When using @GenericGenerator and assigning it via @GeneratedValue.generator, the @GeneratedValue.strategy is ignored: leave it blank."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:926
#, no-c-format
msgid ""
      "@Id @GeneratedValue(generator=\"system-uuid\")\n"
      "@GenericGenerator(name=\"system-uuid\", strategy = \"uuid\")\n"
      "public String getId() {\n"
      "\n"
      "@Id @GeneratedValue(generator=\"trigger-generated\")\n"
      "@GenericGenerator(\n"
      "    name=\"trigger-generated\", \n"
      "    strategy = \"select\",\n"
      "    parameters = @Parameter(name=\"key\", value = \"socialSecurityNumber\")\n"
      ")\n"
      "public String getId() {"
msgstr ""

#. Tag: para
#: basic_mapping.xml:928
#, no-c-format
msgid "The hbm.xml approach uses the optional <literal><generator> child element inside <id>. If any parameters are required to configure or initialize the generator instance, they are passed using the <param> element."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:934
#, no-c-format
msgid ""
      "<id name=\"id\" type=\"long\" column=\"cat_id\">\n"
      "        <generator class=\"org.hibernate.id.TableHiLoGenerator\">\n"
      "                <param name=\"table\">uid_table</param>\n"
      "                <param name=\"column\">next_hi_value_column</param>\n"
      "        </generator>\n"
      "</id>"
msgstr ""

#. Tag: title
#: basic_mapping.xml:937
#, no-c-format
msgid "Various additional generators"
msgstr ""

#. Tag: para
#: basic_mapping.xml:939
#, no-c-format
msgid "All generators implement the interface <literal>org.hibernate.id.IdentifierGenerator. This is a very simple interface. Some applications can choose to provide their own specialized implementations, however, Hibernate provides a range of built-in implementations. The shortcut names for the built-in generators are as follows:"
msgstr ""

#. Tag: literal
#: basic_mapping.xml:946
#, no-c-format
msgid "increment"
msgstr ""

#. Tag: para
#: basic_mapping.xml:949
#, no-c-format
msgid "generates identifiers of type <literal>long, short or int that are unique only when no other process is inserting data into the same table. Do not use in a cluster."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:958
#, no-c-format
msgid "identity"
msgstr ""

#. Tag: para
#: basic_mapping.xml:961
#, no-c-format
msgid "supports identity columns in DB2, MySQL, MS SQL Server, Sybase and HypersonicSQL. The returned identifier is of type <literal>long, short or int."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:969
#, no-c-format
msgid "sequence"
msgstr ""

#. Tag: para
#: basic_mapping.xml:972
#, no-c-format
msgid "uses a sequence in DB2, PostgreSQL, Oracle, SAP DB, McKoi or a generator in Interbase. The returned identifier is of type <literal>long, short or int"
msgstr ""

#. Tag: literal
#: basic_mapping.xml:980
#, no-c-format
msgid "hilo"
msgstr ""

#. Tag: para
#: basic_mapping.xml:984
#, no-c-format
msgid "uses a hi/lo algorithm to efficiently generate identifiers of type <literal>long, short or int, given a table and column (by default hibernate_unique_key and next_hi respectively) as a source of hi values. The hi/lo algorithm generates identifiers that are unique only for a particular database."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:996
#, no-c-format
msgid "seqhilo"
msgstr ""

#. Tag: para
#: basic_mapping.xml:999
#, no-c-format
msgid "uses a hi/lo algorithm to efficiently generate identifiers of type <literal>long, short or int, given a named database sequence."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:1007
#, no-c-format
msgid "uuid"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1010
#, no-c-format
msgid "Generates a 128-bit UUID based on a custom algorithm. The value generated is represented as a string of 32 hexidecimal digits. Users can also configure it to use a separator (config parameter \"separator\") which separates the hexidecimal digits into 8{sep}8{sep}4{sep}8{sep}4. Note specifically that this is different than the IETF RFC 4122 representation of 8-4-4-4-12. If you need RFC 4122 compliant UUIDs, consider using \"uuid2\" generator discussed below."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:1023
#, no-c-format
msgid "uuid2"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1026
#, no-c-format
msgid "Generates a IETF RFC 4122 compliant (variant 2) 128-bit UUID. The exact \"version\" (the RFC term) generated depends on the pluggable \"generation strategy\" used (see below). Capable of generating values as <classname>java.util.UUID, java.lang.String or as a byte array of length 16 (byte[16]). The \"generation strategy\" is defined by the interface org.hibernate.id.UUIDGenerationStrategy. The generator defines 2 configuration parameters for defining which generation strategy to use:"
msgstr ""

#. Tag: literal
#: basic_mapping.xml:1038
#, no-c-format
msgid "uuid_gen_strategy_class"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1041
#, no-c-format
msgid "Names the UUIDGenerationStrategy class to use"
msgstr ""

#. Tag: literal
#: basic_mapping.xml:1047
#, no-c-format
msgid "uuid_gen_strategy"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1050
#, no-c-format
msgid "Names the UUIDGenerationStrategy instance to use"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1056
#, no-c-format
msgid "Out of the box, comes with the following strategies:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1059
#, no-c-format
msgid "<classname>org.hibernate.id.uuid.StandardRandomStrategy (the default) - generates \"version 3\" (aka, \"random\") UUID values via the randomUUID method of java.util.UUID"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1067
#, no-c-format
msgid "<classname>org.hibernate.id.uuid.CustomVersionOneStrategy - generates \"version 1\" UUID values, using IP address since mac address not available. If you need mac address to be used, consider leveraging one of the existing third party UUID generators which sniff out mac address and integrating it via the org.hibernate.id.UUIDGenerationStrategy contract. Two such libraries known at time of this writing include http://johannburkard.de/software/uuid/ and http://commons.apache.org/sandbox/id/uuid.html"
msgstr ""

#. Tag: literal
#: basic_mapping.xml:1085
#, no-c-format
msgid "guid"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1088
#, no-c-format
msgid "uses a database-generated GUID string on MS SQL Server and MySQL."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:1094
#, no-c-format
msgid "native"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1097
#, no-c-format
msgid "selects <literal>identity, sequence or hilo depending upon the capabilities of the underlying database."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:1105
#, no-c-format
msgid "assigned"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1108
#, no-c-format
msgid "lets the application assign an identifier to the object before <literal>save() is called. This is the default strategy if no <generator> element is specified."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:1117
#, no-c-format
msgid "select"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1120
#, no-c-format
msgid "retrieves a primary key, assigned by a database trigger, by selecting the row by some unique key and retrieving the primary key value."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:1127
#, no-c-format
msgid "foreign"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1130
#, no-c-format
msgid "uses the identifier of another associated object. It is usually used in conjunction with a <literal><one-to-one> primary key association."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:1138
#, no-c-format
msgid "sequence-identity"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1141
#, no-c-format
msgid "a specialized sequence generation strategy that utilizes a database sequence for the actual value generation, but combines this with JDBC3 getGeneratedKeys to return the generated identifier value as part of the insert statement execution. This strategy is only supported on Oracle 10g drivers targeted for JDK 1.4. Comments on these insert statements are disabled due to a bug in the Oracle drivers."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1155
#, no-c-format
msgid "Hi/lo algorithm"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1157
#, no-c-format
msgid "The <literal>hilo and seqhilo generators provide two alternate implementations of the hi/lo algorithm. The first implementation requires a \"special\" database table to hold the next available \"hi\" value. Where supported, the second uses an Oracle-style sequence."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1163
#, no-c-format
msgid ""
      "<id name=\"id\" type=\"long\" column=\"cat_id\">\n"
      "        <generator class=\"hilo\">\n"
      "                <param name=\"table\">hi_value</param>\n"
      "                <param name=\"column\">next_value</param>\n"
      "                <param name=\"max_lo\">100</param>\n"
      "        </generator>\n"
      "</id>"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1165
#, no-c-format
msgid ""
      "<id name=\"id\" type=\"long\" column=\"cat_id\">\n"
      "        <generator class=\"seqhilo\">\n"
      "                <param name=\"sequence\">hi_value</param>\n"
      "                <param name=\"max_lo\">100</param>\n"
      "        </generator>\n"
      "</id>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1167
#, no-c-format
msgid "Unfortunately, you cannot use <literal>hilo when supplying your own Connection to Hibernate. When Hibernate uses an application server datasource to obtain connections enlisted with JTA, you must configure the hibernate.transaction.manager_lookup_class."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1175
#, no-c-format
msgid "UUID algorithm"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1177
#, no-c-format
msgid "The UUID contains: IP address, startup time of the JVM that is accurate to a quarter second, system time and a counter value that is unique within the JVM. It is not possible to obtain a MAC address or memory address from Java code, so this is the best option without using JNI."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1185
#, no-c-format
msgid "Identity columns and sequences"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1187
#, no-c-format
msgid "For databases that support identity columns (DB2, MySQL, Sybase, MS SQL), you can use <literal>identity key generation. For databases that support sequences (DB2, Oracle, PostgreSQL, Interbase, McKoi, SAP DB) you can use sequence style key generation. Both of these strategies require two SQL queries to insert a new object. For example:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1195
#, no-c-format
msgid ""
      "<id name=\"id\" type=\"long\" column=\"person_id\">\n"
      "        <generator class=\"sequence\">\n"
      "                <param name=\"sequence\">person_id_sequence</param>\n"
      "        </generator>\n"
      "</id>"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1197
#, no-c-format
msgid ""
      "<id name=\"id\" type=\"long\" column=\"person_id\" unsaved-value=\"0\">\n"
      "        <generator class=\"identity\"/>\n"
      "</id>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1199
#, no-c-format
msgid "For cross-platform development, the <literal>native strategy will, depending on the capabilities of the underlying database, choose from the identity, sequence and hilo strategies."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1207
#, no-c-format
msgid "Assigned identifiers"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1209
#, no-c-format
msgid "If you want the application to assign identifiers, as opposed to having Hibernate generate them, you can use the <literal>assigned generator. This special generator uses the identifier value already assigned to the object's identifier property. The generator is used when the primary key is a natural key instead of a surrogate key. This is the default behavior if you do not specify @GeneratedValue nor <generator> elements."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1218
#, no-c-format
msgid "The <literal>assigned generator makes Hibernate use unsaved-value=\"undefined\". This forces Hibernate to go to the database to determine if an instance is transient or detached, unless there is a version or timestamp property, or you define Interceptor.isUnsaved()."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1226
#, no-c-format
msgid "Primary keys assigned by triggers"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1228
#, no-c-format
msgid "Hibernate does not generate DDL with triggers. It is for legacy schemas only."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1231
#, no-c-format
msgid ""
      "<id name=\"id\" type=\"long\" column=\"person_id\">\n"
      "        <generator class=\"select\">\n"
      "                <param name=\"key\">socialSecurityNumber</param>\n"
      "        </generator>\n"
      "</id>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1233
#, no-c-format
msgid "In the above example, there is a unique valued property named <literal>socialSecurityNumber. It is defined by the class, as a natural key and a surrogate key named person_id, whose value is generated by a trigger."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1241
#, no-c-format
msgid "Identity copy (foreign generator)"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1243
#, no-c-format
msgid "Finally, you can ask Hibernate to copy the identifier from another associated entity. In the Hibernate jargon, it is known as a foreign generator but the JPA mapping reads better and is encouraged."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1248
#, no-c-format
msgid ""
      "@Entity\n"
      "class MedicalHistory implements Serializable {\n"
      "  @Id @OneToOne\n"
      "  @JoinColumn(name = \"person_id\")\n"
      "  Person patient;\n"
      "}\n"
      "\n"
      "@Entity\n"
      "public class Person implements Serializable {\n"
      "  @Id @GeneratedValue Integer id;\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1250
#, no-c-format
msgid "Or alternatively"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1252
#, no-c-format
msgid ""
      "@Entity\n"
      "class MedicalHistory implements Serializable {\n"
      "  @Id Integer id;\n"
      "\n"
      "  @MapsId @OneToOne\n"
      "  @JoinColumn(name = \"patient_id\")\n"
      "  Person patient;\n"
      "}\n"
      "\n"
      "@Entity\n"
      "class Person {\n"
      "  @Id @GeneratedValue Integer id;\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1254
#, no-c-format
msgid "In hbm.xml use the following approach:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1256
#, no-c-format
msgid ""
      "<class name=\"MedicalHistory\">\n"
      "   <id name=\"id\">\n"
      "      <generator class=\"foreign\">\n"
      "         <param name=\"property\">patient</param>\n"
      "      </generator>\n"
      "   </id>\n"
      "   <one-to-one name=\"patient\" class=\"Person\" constrained=\"true\"/>\n"
      "</class>"
msgstr ""

#. Tag: title
#: basic_mapping.xml:1261
#, no-c-format
msgid "Enhanced identifier generators"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1263
#, no-c-format
msgid "Starting with release 3.2.3, there are 2 new generators which represent a re-thinking of 2 different aspects of identifier generation. The first aspect is database portability; the second is optimization Optimization means that you do not have to query the database for every request for a new identifier value. These two new generators are intended to take the place of some of the named generators described above, starting in 3.3.x. However, they are included in the current releases and can be referenced by FQN."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1272
#, no-c-format
msgid "The first of these new generators is <literal>org.hibernate.id.enhanced.SequenceStyleGenerator which is intended, firstly, as a replacement for the sequence generator and, secondly, as a better portability generator than native. This is because native generally chooses between identity and sequence which have largely different semantics that can cause subtle issues in applications eyeing portability. org.hibernate.id.enhanced.SequenceStyleGenerator, however, achieves portability in a different manner. It chooses between a table or a sequence in the database to store its incrementing values, depending on the capabilities of the dialect being used. The difference between this and native is that table-based and sequence-based storage have the same exact semantic. In fact, sequences are exactly what Hibernate tries to emulate with its table-based generators. This generator has a number of configuration parameters:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1291
#, no-c-format
msgid "<literal>sequence_name (optional, defaults to hibernate_sequence): the name of the sequence or table to be used."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1297
#, no-c-format
msgid "<literal>initial_value (optional, defaults to 1): the initial value to be retrieved from the sequence/table. In sequence creation terms, this is analogous to the clause typically named \"STARTS WITH\"."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1304
#, no-c-format
msgid "<literal>increment_size (optional - defaults to 1): the value by which subsequent calls to the sequence/table should differ. In sequence creation terms, this is analogous to the clause typically named \"INCREMENT BY\"."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1312
#, no-c-format
msgid "<literal>force_table_use (optional - defaults to false): should we force the use of a table as the backing structure even though the dialect might support sequence?"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1319
#, no-c-format
msgid "<literal>value_column (optional - defaults to next_val): only relevant for table structures, it is the name of the column on the table which is used to hold the value."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1326
#, no-c-format
msgid "<literal>optimizer (optional - defaults to none): See"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1332
#, no-c-format
msgid "The second of these new generators is <literal>org.hibernate.id.enhanced.TableGenerator, which is intended, firstly, as a replacement for the table generator, even though it actually functions much more like org.hibernate.id.MultipleHiLoPerTableGenerator, and secondly, as a re-implementation of org.hibernate.id.MultipleHiLoPerTableGenerator that utilizes the notion of pluggable optimizers. Essentially this generator defines a table capable of holding a number of different increment values simultaneously by using multiple distinctly keyed rows. This generator has a number of configuration parameters:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1345
#, no-c-format
msgid "<literal>table_name (optional - defaults to hibernate_sequences): the name of the table to be used."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1351
#, no-c-format
msgid "<literal>value_column_name (optional - defaults to next_val): the name of the column on the table that is used to hold the value."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1357
#, no-c-format
msgid "<literal>segment_column_name (optional - defaults to sequence_name): the name of the column on the table that is used to hold the \"segment key\". This is the value which identifies which increment value to use."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1365
#, no-c-format
msgid "<literal>segment_value (optional - defaults to default): The \"segment key\" value for the segment from which we want to pull increment values for this generator."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1372
#, no-c-format
msgid "<literal>segment_value_length (optional - defaults to 255): Used for schema generation; the column size to create this segment key column."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1378
#, no-c-format
msgid "<literal>initial_value (optional - defaults to 1): The initial value to be retrieved from the table."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1384
#, no-c-format
msgid "<literal>increment_size (optional - defaults to 1): The value by which subsequent calls to the table should differ."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1390
#, no-c-format
msgid "<literal>optimizer (optional - defaults to ??): See ."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1397
#, no-c-format
msgid "Identifier generator optimization"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1399
#, no-c-format
msgid "For identifier generators that store values in the database, it is inefficient for them to hit the database on each and every call to generate a new identifier value. Instead, you can group a bunch of them in memory and only hit the database when you have exhausted your in-memory value group. This is the role of the pluggable optimizers. Currently only the two enhanced generators (<xref linkend=\"mapping-declaration-id-enhanced\"/> support this operation."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1410
#, no-c-format
msgid "<literal>none (generally this is the default if no optimizer was specified): this will not perform any optimizations and hit the database for each and every request."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1417
#, no-c-format
msgid "<literal>hilo: applies a hi/lo algorithm around the database retrieved values. The values from the database for this optimizer are expected to be sequential. The values retrieved from the database structure for this optimizer indicates the \"group number\". The increment_size is multiplied by that value in memory to define a group \"hi value\"."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1427
#, no-c-format
msgid "<literal>pooled: as with the case of hilo, this optimizer attempts to minimize the number of hits to the database. Here, however, we simply store the starting value for the \"next group\" into the database structure rather than a sequential value in combination with an in-memory grouping algorithm. Here, increment_size refers to the values coming from the database."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1441
#, no-c-format
msgid "Partial identifier generation"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1443
#, no-c-format
msgid "Hibernate supports the automatic generation of some of the identifier properties. Simply use the <classname>@GeneratedValue annotation on one or several id properties."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1449
#, no-c-format
msgid "The Hibernate team has always felt such a construct as fundamentally wrong. Try hard to fix your data model before using this feature."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1454
#, no-c-format
msgid ""
      "@Entity\n"
      "public class CustomerInventory implements Serializable {\n"
      "  @Id\n"
      "  @TableGenerator(name = \"inventory\",\n"
      "    table = \"U_SEQUENCES\",\n"
      "    pkColumnName = \"S_ID\",\n"
      "    valueColumnName = \"S_NEXTNUM\",\n"
      "    pkColumnValue = \"inventory\",\n"
      "    allocationSize = 1000)\n"
      "  @GeneratedValue(strategy = GenerationType.TABLE, generator = \"inventory\")\n"
      "  Integer id;\n"
      "\n"
      "\n"
      "  @Id @ManyToOne(cascade = CascadeType.MERGE)\n"
      "  Customer customer;\n"
      "}\n"
      "\n"
      "@Entity\n"
      "public class Customer implements Serializable {\n"
      "   @Id\n"
      "   private int id;\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1456
#, no-c-format
msgid "You can also generate properties inside an <classname>@EmbeddedId class."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1462
#, no-c-format
msgid "Optimistic locking properties (optional)"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1464
#, no-c-format
msgid "When using long transactions or conversations that span several database transactions, it is useful to store versioning data to ensure that if the same entity is updated by two conversations, the last to commit changes will be informed and not override the other conversation's work. It guarantees some isolation while still allowing for good scalability and works particularly well in read-often write-sometimes situations."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1472
#, no-c-format
msgid "You can use two approaches: a dedicated version number or a timestamp."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1475
#, no-c-format
msgid "A version or timestamp property should never be null for a detached instance. Hibernate will detect any instance with a null version or timestamp as transient, irrespective of what other <literal>unsaved-value strategies are specified. Declaring a nullable version or timestamp property is an easy way to avoid problems with transitive reattachment in Hibernate. It is especially useful for people using assigned identifiers or composite keys."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1485
#, no-c-format
msgid "Version number"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1487
#, no-c-format
msgid "You can add optimistic locking capability to an entity using the <literal>@Version annotation:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1490
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Flight implements Serializable {\n"
      "...\n"
      "    @Version\n"
      "    @Column(name=\"OPTLOCK\")\n"
      "    public Integer getVersion() { ... }\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1492
#, no-c-format
msgid "The version property will be mapped to the <literal>OPTLOCK column, and the entity manager will use it to detect conflicting updates (preventing lost updates you might otherwise see with the last-commit-wins strategy)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1497
#, no-c-format
msgid "The version column may be a numeric. Hibernate supports any kind of type provided that you define and implement the appropriate <classname>UserVersionType."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1501
#, no-c-format
msgid "The application must not alter the version number set up by Hibernate in any way. To artificially increase the version number, check in Hibernate Entity Manager's reference documentation <literal>LockModeType.OPTIMISTIC_FORCE_INCREMENT or LockModeType.PESSIMISTIC_FORCE_INCREMENT."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1507
#, no-c-format
msgid "If the version number is generated by the database (via a trigger for example), make sure to use <code>@org.hibernate.annotations.Generated(GenerationTime.ALWAYS)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1511
#, no-c-format
msgid "To declare a version property in hbm.xml, use:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1530
#, no-c-format
msgid ""
      "<version\n"
      "        column=\"version_column\"\n"
      "        name=\"propertyName\"\n"
      "        type=\"typename\"\n"
      "        access=\"field|property|ClassName\"\n"
      "        unsaved-value=\"null|negative|undefined\"\n"
      "        generated=\"never|always\"\n"
      "        insert=\"true|false\"\n"
      "        node=\"element-name|@attribute-name|element/@attribute|.\"\n"
      "/>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1534
#, no-c-format
msgid "<literal>column (optional - defaults to the property name): the name of the column holding the version number."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1540
#, no-c-format
msgid "<literal>name: the name of a property of the persistent class."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1545
#, no-c-format
msgid "<literal>type (optional - defaults to integer): the type of the version number."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1551
#, no-c-format
msgid "<literal>access (optional - defaults to property): the strategy Hibernate uses to access the property value."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1557
#, no-c-format
msgid "<literal>unsaved-value (optional - defaults to undefined): a version property value that indicates that an instance is newly instantiated (unsaved), distinguishing it from detached instances that were saved or loaded in a previous session. Undefined specifies that the identifier property value should be used."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1567
#, no-c-format
msgid "<literal>generated (optional - defaults to never): specifies that this version property value is generated by the database. See the discussion of generated properties for more information."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1575
#, no-c-format
msgid "<literal>insert (optional - defaults to true): specifies whether the version column should be included in SQL insert statements. It can be set to false if the database column is defined with a default value of 0."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1586
#, no-c-format
msgid "Timestamp"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1588
#, no-c-format
msgid "Alternatively, you can use a timestamp. Timestamps are a less safe implementation of optimistic locking. However, sometimes an application might use the timestamps in other ways as well."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1592
#, no-c-format
msgid "Simply mark a property of type <classname>Date or Calendar as @Version."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1596
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Flight implements Serializable {\n"
      "...\n"
      "    @Version\n"
      "    public Date getLastUpdate() { ... }\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1598
#, no-c-format
msgid "When using timestamp versioning you can tell Hibernate where to retrieve the timestamp value from - database or JVM - by optionally adding the <classname>@org.hibernate.annotations.Source annotation to the property. Possible values for the value attribute of the annotation are org.hibernate.annotations.SourceType.VM and org.hibernate.annotations.SourceType.DB. The default is SourceType.DB which is also used in case there is no @Source annotation at all."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1609
#, no-c-format
msgid "Like in the case of version numbers, the timestamp can also be generated by the database instead of Hibernate. To do that, use <code>@org.hibernate.annotations.Generated(GenerationTime.ALWAYS)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1613
#, no-c-format
msgid "In hbm.xml, use the <literal><timestamp> element:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1631
#, no-c-format
msgid ""
      "<timestamp\n"
      "        column=\"timestamp_column\"\n"
      "        name=\"propertyName\"\n"
      "        access=\"field|property|ClassName\"\n"
      "        unsaved-value=\"null|undefined\"\n"
      "        source=\"vm|db\"\n"
      "        generated=\"never|always\"\n"
      "        node=\"element-name|@attribute-name|element/@attribute|.\"\n"
      "/>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1635
#, no-c-format
msgid "<literal>column (optional - defaults to the property name): the name of a column holding the timestamp."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1641
#, no-c-format
msgid "<literal>name: the name of a JavaBeans style property of Java type Date or Timestamp of the persistent class."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1647 basic_mapping.xml:2174 basic_mapping.xml:2391 basic_mapping.xml:3262 basic_mapping.xml:3456 basic_mapping.xml:3629
#, no-c-format
msgid "<literal>access (optional - defaults to property): the strategy Hibernate uses for accessing the property value."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1653
#, no-c-format
msgid "<literal>unsaved-value (optional - defaults to null): a version property value that indicates that an instance is newly instantiated (unsaved), distinguishing it from detached instances that were saved or loaded in a previous session. Undefined specifies that the identifier property value should be used."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1663
#, no-c-format
msgid "<literal>source (optional - defaults to vm): Where should Hibernate retrieve the timestamp value from? From the database, or from the current JVM? Database-based timestamps incur an overhead because Hibernate must hit the database in order to determine the \"next value\". It is safer to use in clustered environments. Not all Dialects are known to support the retrieval of the database's current timestamp. Others may also be unsafe for usage in locking due to lack of precision (Oracle 8, for example)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1676
#, no-c-format
msgid "<literal>generated (optional - defaults to never): specifies that this timestamp property value is actually generated by the database. See the discussion of generated properties for more information."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1686
#, no-c-format
msgid "Note"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1688
#, no-c-format
msgid "<literal><Timestamp> is equivalent to <version type=\"timestamp\">. And <timestamp source=\"db\"> is equivalent to <version type=\"dbtimestamp\">"
msgstr ""

#. Tag: title
#: basic_mapping.xml:1697
#, no-c-format
msgid "Property"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1699
#, no-c-format
msgid "You need to decide which property needs to be made persistent in a given entity. This differs slightly between the annotation driven metadata and the hbm.xml files."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1704
#, no-c-format
msgid "Property mapping with annotations"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1706
#, no-c-format
msgid "In the annotations world, every non static non transient property (field or method depending on the access type) of an entity is considered persistent, unless you annotate it as <literal>@Transient. Not having an annotation for your property is equivalent to the appropriate @Basic annotation."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1713
#, no-c-format
msgid "The <literal>@Basic annotation allows you to declare the fetching strategy for a property. If set to LAZY, specifies that this property should be fetched lazily when the instance variable is first accessed. It requires build-time bytecode instrumentation, if your classes are not instrumented, property level lazy loading is silently ignored. The default is EAGER. You can also mark a property as not optional thanks to the @Basic.optional attribute. This will ensure that the underlying column are not nullable (if possible). Note that a better approach is to use the @NotNull annotation of the Bean Validation specification."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1726
#, no-c-format
msgid "Let's look at a few examples:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1728
#, no-c-format
msgid ""
      "public transient int counter; //transient property\n"
      "\n"
      "private String firstname; //persistent property\n"
      "\n"
      "@Transient\n"
      "String getLengthInMeter() { ... } //transient property\n"
      "\n"
      "String getName() {... } // persistent property\n"
      "\n"
      "@Basic\n"
      "int getLength() { ... } // persistent property\n"
      "\n"
      "@Basic(fetch = FetchType.LAZY)\n"
      "String getDetailedComment() { ... } // persistent property\n"
      "\n"
      "@Temporal(TemporalType.TIME)\n"
      "java.util.Date getDepartureTime() { ... } // persistent property           \n"
      "\n"
      "@Enumerated(EnumType.STRING)\n"
      "Starred getNote() { ... } //enum persisted as String in database"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1730
#, no-c-format
msgid "<literal>counter, a transient field, and lengthInMeter, a method annotated as @Transient, and will be ignored by the Hibernate. name, length, and firstname properties are mapped persistent and eagerly fetched (the default for simple properties). The detailedComment property value will be lazily fetched from the database once a lazy property of the entity is accessed for the first time. Usually you don't need to lazy simple properties (not to be confused with lazy association fetching). The recommended alternative is to use the projection capability of JP-QL (Java Persistence Query Language) or Criteria queries."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1743
#, no-c-format
msgid "JPA support property mapping of all basic types supported by Hibernate (all basic Java types , their respective wrappers and serializable classes). Hibernate Annotations supports out of the box enum type mapping either into a ordinal column (saving the enum ordinal) or a string based column (saving the enum string representation): the persistence representation, defaulted to ordinal, can be overridden through the <literal>@Enumerated annotation as shown in the note property example."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1753
#, no-c-format
msgid "In plain Java APIs, the temporal precision of time is not defined. When dealing with temporal data you might want to describe the expected precision in database. Temporal data can have <literal>DATE, TIME, or TIMESTAMP precision (ie the actual date, only the time, or both). Use the @Temporal annotation to fine tune that."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1761
#, no-c-format
msgid "<literal>@Lob indicates that the property should be persisted in a Blob or a Clob depending on the property type: java.sql.Clob, Character[], char[] and java.lang.String will be persisted in a Clob. java.sql.Blob, Byte[], byte[] and Serializable type will be persisted in a Blob."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1770
#, no-c-format
msgid ""
      "@Lob\n"
      "public String getFullText() {\n"
      "    return fullText;\n"
      "}\n"
      "\n"
      "@Lob\n"
      "public byte[] getFullCode() {\n"
      "    return fullCode;\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1772
#, no-c-format
msgid "If the property type implements <classname>java.io.Serializable and is not a basic type, and if the property is not annotated with @Lob, then the Hibernate serializable type is used."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1779
#, no-c-format
msgid "Type"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1781
#, no-c-format
msgid "You can also manually specify a type using the <literal>@org.hibernate.annotations.Type and some parameters if needed. @Type.type could be:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1788 basic_mapping.xml:2220
#, no-c-format
msgid "The name of a Hibernate basic type: <literal>integer, string, character, date, timestamp, float, binary, serializable, object, blob etc."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1794 basic_mapping.xml:2226
#, no-c-format
msgid "The name of a Java class with a default basic type: <literal>int, float, char, java.lang.String, java.util.Date, java.lang.Integer, java.sql.Clob etc."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1800 basic_mapping.xml:2232
#, no-c-format
msgid "The name of a serializable Java class."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1804 basic_mapping.xml:2236
#, no-c-format
msgid "The class name of a custom type: <literal>com.illflow.type.MyCustomType etc."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1809
#, no-c-format
msgid "If you do not specify a type, Hibernate will use reflection upon the named property and guess the correct Hibernate type. Hibernate will attempt to interpret the name of the return class of the property getter using, in order, rules 2, 3, and 4."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1814
#, no-c-format
msgid "<literal>@org.hibernate.annotations.TypeDef and @org.hibernate.annotations.TypeDefs allows you to declare type definitions. These annotations can be placed at the class or package level. Note that these definitions are global for the session factory (even when defined at the class level). If the type is used on a single entity, you can place the definition on the entity itself. Otherwise, it is recommended to place the definition at the package level. In the example below, when Hibernate encounters a property of class PhoneNumer, it delegates the persistence strategy to the custom mapping type PhoneNumberType. However, properties belonging to other classes, too, can delegate their persistence strategy to PhoneNumberType, by explicitly using the @Type annotation."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1830
#, no-c-format
msgid "Package level annotations are placed in a file named <filename>package-info.java in the appropriate package. Place your annotations before the package declaration."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1835
#, no-c-format
msgid ""
      "@TypeDef(\n"
      "   name = \"phoneNumber\",\n"
      "   defaultForType = PhoneNumber.class,\n"
      "   typeClass = PhoneNumberType.class\n"
      ")\n"
      "\n"
      "@Entity\n"
      "public class ContactDetails {\n"
      "   [...]\n"
      "   private PhoneNumber localPhoneNumber;\n"
      "   @Type(type=\"phoneNumber\")\n"
      "   private OverseasPhoneNumber overseasPhoneNumber;\n"
      "   [...]\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1837
#, no-c-format
msgid "The following example shows the usage of the <literal>parameters attribute to customize the TypeDef."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1841
#, no-c-format
msgid ""
      "//in org/hibernate/test/annotations/entity/package-info.java\n"
      "@TypeDefs(\n"
      "    {\n"
      "    @TypeDef(\n"
      "        name=\"caster\",\n"
      "        typeClass = CasterStringType.class,\n"
      "        parameters = {\n"
      "            @Parameter(name=\"cast\", value=\"lower\")\n"
      "        }\n"
      "    )\n"
      "    }\n"
      ")\n"
      "package org.hibernate.test.annotations.entity;\n"
      "\n"
      "//in org/hibernate/test/annotations/entity/Forest.java\n"
      "public class Forest {\n"
      "    @Type(type=\"caster\")\n"
      "    public String getSmallText() {\n"
      "    ...\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1843
#, no-c-format
msgid "When using composite user type, you will have to express column definitions. The <literal>@Columns has been introduced for that purpose."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1847
#, no-c-format
msgid ""
      "@Type(type=\"org.hibernate.test.annotations.entity.MonetaryAmountUserType\")\n"
      "@Columns(columns = {\n"
      "    @Column(name=\"r_amount\"),\n"
      "    @Column(name=\"r_currency\")\n"
      "})\n"
      "public MonetaryAmount getAmount() {\n"
      "    return amount;\n"
      "}\n"
      "\n"
      "\n"
      "public class MonetaryAmount implements Serializable {\n"
      "    private BigDecimal amount;\n"
      "    private Currency currency;\n"
      "    ...\n"
      "}"
msgstr ""

#. Tag: title
#: basic_mapping.xml:1851
#, no-c-format
msgid "Access type"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1853
#, no-c-format
msgid "By default the access type of a class hierarchy is defined by the position of the <classname>@Id or @EmbeddedId annotations. If these annotations are on a field, then only fields are considered for persistence and the state is accessed via the field. If there annotations are on a getter, then only the getters are considered for persistence and the state is accessed via the getter/setter. That works well in practice and is the recommended approach."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1861
#, no-c-format
msgid "The placement of annotations within a class hierarchy has to be consistent (either field or on property) to be able to determine the default access type. It is recommended to stick to one single annotation placement strategy throughout your whole application."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1868
#, no-c-format
msgid "However in some situations, you need to:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1872
#, no-c-format
msgid "force the access type of the entity hierarchy"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1876
#, no-c-format
msgid "override the access type of a specific entity in the class hierarchy"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1881
#, no-c-format
msgid "override the access type of an embeddable type"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1885
#, no-c-format
msgid "The best use case is an embeddable class used by several entities that might not use the same access type. In this case it is better to force the access type at the embeddable class level."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1890
#, no-c-format
msgid "To force the access type on a given class, use the <classname>@Access annotation as showed below:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1893
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Order {\n"
      "   @Id private Long id;\n"
      "   public Long getId() { return id; }\n"
      "   public void setId(Long id) { this.id = id; }\n"
      "\n"
      "   @Embedded private Address address;\n"
      "   public Address getAddress() { return address; }\n"
      "   public void setAddress() { this.address = address; }\n"
      "}\n"
      "\n"
      "@Entity\n"
      "public class User {\n"
      "   private Long id;\n"
      "   @Id public Long getId() { return id; }\n"
      "   public void setId(Long id) { this.id = id; }\n"
      "\n"
      "   private Address address;\n"
      "   @Embedded public Address getAddress() { return address; }\n"
      "   public void setAddress() { this.address = address; }\n"
      "}\n"
      "\n"
      "@Embeddable\n"
      "@Access(AcessType.PROPERTY)\n"
      "public class Address {\n"
      "   private String street1;\n"
      "   public String getStreet1() { return street1; }\n"
      "   public void setStreet1() { this.street1 = street1; }\n"
      "\n"
      "   private hashCode; //not persistent\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1895
#, no-c-format
msgid "You can also override the access type of a single property while keeping the other properties standard."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1898
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Order {\n"
      "   @Id private Long id;\n"
      "   public Long getId() { return id; }\n"
      "   public void setId(Long id) { this.id = id; }\n"
      "   @Transient private String userId;\n"
      "   @Transient private String orderId;\n"
      "\n"
      "   @Access(AccessType.PROPERTY)\n"
      "   public String getOrderNumber() { return userId + \":\" + orderId; }\n"
      "   public void setOrderNumber() { this.userId = ...; this.orderId = ...; }\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1900
#, no-c-format
msgid "In this example, the default access type is <classname>FIELD except for the orderNumber property. Note that the corresponding field, if any must be marked as @Transient or transient."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1907
#, no-c-format
msgid "@org.hibernate.annotations.AccessType"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1909
#, no-c-format
msgid "The annotation <classname>@org.hibernate.annotations.AccessType should be considered deprecated for FIELD and PROPERTY access. It is still useful however if you need to use a custom access type."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1918
#, no-c-format
msgid "Optimistic lock"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1920
#, no-c-format
msgid "It is sometimes useful to avoid increasing the version number even if a given property is dirty (particularly collections). You can do that by annotating the property (or collection) with <literal>@OptimisticLock(excluded=true)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1925
#, no-c-format
msgid "More formally, specifies that updates to this property do not require acquisition of the optimistic lock."
msgstr ""

#. Tag: title
#: basic_mapping.xml:1930
#, no-c-format
msgid "Declaring column attributes"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1932
#, no-c-format
msgid "The column(s) used for a property mapping can be defined using the <literal>@Column annotation. Use it to override default values (see the JPA specification for more information on the defaults). You can use this annotation at the property level for properties that are:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1940
#, no-c-format
msgid "not annotated at all"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1944
#, no-c-format
msgid "annotated with <literal>@Basic"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1948
#, no-c-format
msgid "annotated with <literal>@Version"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1952
#, no-c-format
msgid "annotated with <literal>@Lob"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1956
#, no-c-format
msgid "annotated with <literal>@Temporal"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1960
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Flight implements Serializable {\n"
      "...\n"
      "@Column(updatable = false, name = \"flight_name\", nullable = false, length=50)\n"
      "public String getName() { ... }"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1962
#, no-c-format
msgid "The <literal>name property is mapped to the flight_name column, which is not nullable, has a length of 50 and is not updatable (making the property immutable)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:1967
#, no-c-format
msgid "This annotation can be applied to regular properties as well as <literal>@Id or @Version properties."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:1994
#, no-c-format
msgid ""
      "@Column(\n"
      "    name=\"columnName\";\n"
      "    boolean unique() default false;\n"
      "    boolean nullable() default true;\n"
      "    boolean insertable() default true;\n"
      "    boolean updatable() default true;\n"
      "    String columnDefinition() default \"\";\n"
      "    String table() default \"\";\n"
      "    int length() default 255;\n"
      "    int precision() default 0; // decimal precision\n"
      "    int scale() default 0; // decimal scale"
msgstr ""

#. Tag: para
#: basic_mapping.xml:1998
#, no-c-format
msgid "<literal>name (optional): the column name (default to the property name)"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2003
#, no-c-format
msgid "<literal>unique (optional): set a unique constraint on this column or not (default false)"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2008
#, no-c-format
msgid "<literal>nullable (optional): set the column as nullable (default true)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2013
#, no-c-format
msgid "<literal>insertable (optional): whether or not the column will be part of the insert statement (default true)"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2019
#, no-c-format
msgid "<literal>updatable (optional): whether or not the column will be part of the update statement (default true)"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2025
#, no-c-format
msgid "<literal>columnDefinition (optional): override the sql DDL fragment for this particular column (non portable)"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2031
#, no-c-format
msgid "<literal>table (optional): define the targeted table (default primary table)"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2036
#, no-c-format
msgid "<literal>length (optional): column length (default 255)"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2041
#, no-c-format
msgid "<literal>precision (optional): column decimal precision (default 0)"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2046
#, no-c-format
msgid "<literal>scale (optional): column decimal scale if useful (default 0)"
msgstr ""

#. Tag: title
#: basic_mapping.xml:2054
#, no-c-format
msgid "Formula"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2056
#, no-c-format
msgid "Sometimes, you want the Database to do some computation for you rather than in the JVM, you might also create some kind of virtual column. You can use a SQL fragment (aka formula) instead of mapping a property into a column. This kind of property is read only (its value is calculated by your formula fragment)."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2062
#, no-c-format
msgid ""
      "@Formula(\"obj_length * obj_height * obj_width\")\n"
      "public long getObjectVolume()"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2064
#, no-c-format
msgid "The SQL fragment can be as complex as you want and even include subselects."
msgstr ""

#. Tag: title
#: basic_mapping.xml:2069
#, no-c-format
msgid "Non-annotated property defaults"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2071
#, no-c-format
msgid "If a property is not annotated, the following rules apply:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2074
#, no-c-format
msgid "If the property is of a single type, it is mapped as @Basic"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2079
#, no-c-format
msgid "Otherwise, if the type of the property is annotated as @Embeddable, it is mapped as @Embedded"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2084
#, no-c-format
msgid "Otherwise, if the type of the property is <classname>Serializable, it is mapped as @Basic in a column holding the object in its serialized version"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2091
#, no-c-format
msgid "Otherwise, if the type of the property is <classname>java.sql.Clob or java.sql.Blob, it is mapped as @Lob with the appropriate LobType"
msgstr ""

#. Tag: title
#: basic_mapping.xml:2102
#, no-c-format
msgid "Property mapping with hbm.xml"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2104
#, no-c-format
msgid "The <literal><property> element declares a persistent JavaBean style property of the class."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2136
#, no-c-format
msgid ""
      "<property\n"
      "        name=\"propertyName\"\n"
      "        column=\"column_name\"\n"
      "        type=\"typename\"\n"
      "        update=\"true|false\"\n"
      "        insert=\"true|false\"\n"
      "        formula=\"arbitrary SQL expression\"\n"
      "        access=\"field|property|ClassName\"\n"
      "        lazy=\"true|false\"\n"
      "        unique=\"true|false\"\n"
      "        not-null=\"true|false\"\n"
      "        optimistic-lock=\"true|false\"\n"
      "        generated=\"never|insert|always\"\n"
      "        node=\"element-name|@attribute-name|element/@attribute|.\"\n"
      "        index=\"index_name\"\n"
      "        unique_key=\"unique_key_id\"\n"
      "        length=\"L\"\n"
      "        precision=\"P\"\n"
      "        scale=\"S\"\n"
      "/>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2140
#, no-c-format
msgid "<literal>name: the name of the property, with an initial lowercase letter."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2145
#, no-c-format
msgid "<literal>column (optional - defaults to the property name): the name of the mapped database table column. This can also be specified by nested <column> element(s)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2157
#, no-c-format
msgid "<literal>update, insert (optional - defaults to true): specifies that the mapped columns should be included in SQL UPDATE and/or INSERT statements. Setting both to false allows a pure \"derived\" property whose value is initialized from some other property that maps to the same column(s), or by a trigger or other application."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2167
#, no-c-format
msgid "<literal>formula (optional): an SQL expression that defines the value for a computed property. Computed properties do not have a column mapping of their own."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2180
#, no-c-format
msgid "<literal>lazy (optional - defaults to false): specifies that this property should be fetched lazily when the instance variable is first accessed. It requires build-time bytecode instrumentation."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2187
#, no-c-format
msgid "<literal>unique (optional): enables the DDL generation of a unique constraint for the columns. Also, allow this to be the target of a property-ref."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2194
#, no-c-format
msgid "<literal>not-null (optional): enables the DDL generation of a nullability constraint for the columns."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2199 basic_mapping.xml:3282
#, no-c-format
msgid "<literal>optimistic-lock (optional - defaults to true): specifies that updates to this property do or do not require acquisition of the optimistic lock. In other words, it determines if a version increment should occur when this property is dirty."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2207
#, no-c-format
msgid "<literal>generated (optional - defaults to never): specifies that this property value is actually generated by the database. See the discussion of generated properties for more information."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2216
#, no-c-format
msgid "<emphasis>typename could be:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2241
#, no-c-format
msgid "If you do not specify a type, Hibernate will use reflection upon the named property and guess the correct Hibernate type. Hibernate will attempt to interpret the name of the return class of the property getter using, in order, rules 2, 3, and 4. In certain cases you will need the <literal>type attribute. For example, to distinguish between Hibernate.DATE and Hibernate.TIMESTAMP, or to specify a custom type."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2250
#, no-c-format
msgid "The <literal>access attribute allows you to control how Hibernate accesses the property at runtime. By default, Hibernate will call the property get/set pair. If you specify access=\"field\", Hibernate will bypass the get/set pair and access the field directly using reflection. You can specify your own strategy for property access by naming a class that implements the interface org.hibernate.property.PropertyAccessor."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2259
#, no-c-format
msgid "A powerful feature is derived properties. These properties are by definition read-only. The property value is computed at load time. You declare the computation as an SQL expression. This then translates to a <literal>SELECT clause subquery in the SQL query that loads an instance:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2265
#, no-c-format
msgid ""
      "<property name=\"totalPrice\"\n"
      "    formula=\"( SELECT SUM (li.quantity*p.price) FROM LineItem li, Product p\n"
      "                WHERE li.productId = p.productId\n"
      "                AND li.customerId = customerId\n"
      "                AND li.orderNumber = orderNumber )\"/>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2267
#, no-c-format
msgid "You can reference the entity table by not declaring an alias on a particular column. This would be <literal>customerId in the given example. You can also use the nested <formula> mapping element if you do not want to use the attribute."
msgstr ""

#. Tag: title
#: basic_mapping.xml:2276
#, no-c-format
msgid "Embedded objects (aka components)"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2278
#, no-c-format
msgid "Embeddable objects (or components) are objects whose properties are mapped to the same table as the owning entity's table. Components can, in turn, declare their own properties, components or collections"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2283
#, no-c-format
msgid "It is possible to declare an embedded component inside an entity and even override its column mapping. Component classes have to be annotated at the class level with the <literal>@Embeddable annotation. It is possible to override the column mapping of an embedded object for a particular entity using the @Embedded and @AttributeOverride annotation in the associated property:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2291
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Person implements Serializable {\n"
      "\n"
      "    // Persistent component using defaults\n"
      "    Address homeAddress;\n"
      "\n"
      "    @Embedded\n"
      "    @AttributeOverrides( {\n"
      "            @AttributeOverride(name=\"iso2\", column = @Column(name=\"bornIso2\") ),\n"
      "            @AttributeOverride(name=\"name\", column = @Column(name=\"bornCountryName\") )\n"
      "    } )\n"
      "    Country bornIn;\n"
      "    ...\n"
      "}"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2293
#, no-c-format
msgid ""
      "@Embeddable\n"
      "public class Address implements Serializable {\n"
      "    String city;\n"
      "    Country nationality; //no overriding here\n"
      "}"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2295
#, no-c-format
msgid ""
      "@Embeddable\n"
      "public class Country implements Serializable {\n"
      "    private String iso2;\n"
      "    @Column(name=\"countryName\") private String name;\n"
      "\n"
      "    public String getIso2() { return iso2; }\n"
      "    public void setIso2(String iso2) { this.iso2 = iso2; }\n"
      "\n"
      "    \n"
      "    public String getName() { return name; }\n"
      "    public void setName(String name) { this.name = name; }\n"
      "    ...\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2297
#, no-c-format
msgid "An embeddable object inherits the access type of its owning entity (note that you can override that using the <literal>@Access annotation)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2301
#, no-c-format
msgid "The <literal>Person entity has two component properties, homeAddress and bornIn. homeAddress property has not been annotated, but Hibernate will guess that it is a persistent component by looking for the @Embeddable annotation in the Address class. We also override the mapping of a column name (to bornCountryName) with the @Embedded and @AttributeOverride annotations for each mapped attribute of Country. As you can see, Country is also a nested component of Address, again using auto-detection by Hibernate and JPA defaults. Overriding columns of embedded objects of embedded objects is through dotted expressions."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2316
#, no-c-format
msgid ""
      "@Embedded\n"
      "    @AttributeOverrides( {\n"
      "            @AttributeOverride(name=\"city\", column = @Column(name=\"fld_city\") ),\n"
      "            @AttributeOverride(name=\"nationality.iso2\", column = @Column(name=\"nat_Iso2\") ),\n"
      "            @AttributeOverride(name=\"nationality.name\", column = @Column(name=\"nat_CountryName\") )\n"
      "            //nationality columns in homeAddress are overridden\n"
      "    } )\n"
      "    Address homeAddress;"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2318
#, no-c-format
msgid "Hibernate Annotations supports something that is not explicitly supported by the JPA specification. You can annotate a embedded object with the <literal>@MappedSuperclass annotation to make the superclass properties persistent (see @MappedSuperclass for more informations)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2324
#, no-c-format
msgid "You can also use association annotations in an embeddable object (ie <literal>@OneToOne, @ManyToOne, @OneToMany or @ManyToMany). To override the association columns you can use @AssociationOverride."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2330
#, no-c-format
msgid "If you want to have the same embeddable object type twice in the same entity, the column name defaulting will not work as several embedded objects would share the same set of columns. In plain JPA, you need to override at least one set of columns. Hibernate, however, allows you to enhance the default naming mechanism through the <classname>NamingStrategy interface. You can write a strategy that prevent name clashing in such a situation. DefaultComponentSafeNamingStrategy is an example of this."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2340
#, no-c-format
msgid "If a property of the embedded object points back to the owning entity, annotate it with the <classname>@Parent annotation. Hibernate will make sure this property is properly loaded with the entity reference."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2345
#, no-c-format
msgid "In XML, use the <literal><component> element."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2367
#, no-c-format
msgid ""
      "<component\n"
      "        name=\"propertyName\"\n"
      "        class=\"className\"\n"
      "        insert=\"true|false\"\n"
      "        update=\"true|false\"\n"
      "        access=\"field|property|ClassName\"\n"
      "        lazy=\"true|false\"\n"
      "        optimistic-lock=\"true|false\"\n"
      "        unique=\"true|false\"\n"
      "        node=\"element-name|.\"\n"
      ">\n"
      "\n"
      "        <property ...../>\n"
      "        <many-to-one .... />\n"
      "        ........\n"
      "</component>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2371 basic_mapping.xml:3217 basic_mapping.xml:3417
#, no-c-format
msgid "<literal>name: the name of the property."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2375
#, no-c-format
msgid "<literal>class (optional - defaults to the property type determined by reflection): the name of the component (child) class."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2381 basic_mapping.xml:3677
#, no-c-format
msgid "<literal>insert: do the mapped columns appear in SQL INSERTs?"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2386 basic_mapping.xml:3682
#, no-c-format
msgid "<literal>update: do the mapped columns appear in SQL UPDATEs?"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2397
#, no-c-format
msgid "<literal>lazy (optional - defaults to false): specifies that this component should be fetched lazily when the instance variable is first accessed. It requires build-time bytecode instrumentation."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2404
#, no-c-format
msgid "<literal>optimistic-lock (optional - defaults to true): specifies that updates to this component either do or do not require acquisition of the optimistic lock. It determines if a version increment should occur when this property is dirty."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2412 basic_mapping.xml:3695
#, no-c-format
msgid "<literal>unique (optional - defaults to false): specifies that a unique constraint exists upon all mapped columns of the component."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2419
#, no-c-format
msgid "The child <literal><property> tags map properties of the child class to table columns."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2422
#, no-c-format
msgid "The <literal><component> element allows a <parent> subelement that maps a property of the component class as a reference back to the containing entity."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2426
#, no-c-format
msgid "The <literal><dynamic-component> element allows a Map to be mapped as a component, where the property names refer to keys of the map. See  for more information. This feature is not supported in annotations."
msgstr ""

#. Tag: title
#: basic_mapping.xml:2434
#, no-c-format
msgid "Inheritance strategy"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2436
#, no-c-format
msgid "Java is a language supporting polymorphism: a class can inherit from another. Several strategies are possible to persist a class hierarchy:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2442
#, no-c-format
msgid "Single table per class hierarchy strategy: a single table hosts all the instances of a class hierarchy"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2447
#, no-c-format
msgid "Joined subclass strategy: one table per class and subclass is present and each table persist the properties specific to a given subclass. The state of the entity is then stored in its corresponding class table and all its superclasses"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2454
#, no-c-format
msgid "Table per class strategy: one table per concrete class and subclass is present and each table persist the properties of the class and its superclasses. The state of the entity is then stored entirely in the dedicated table for its class."
msgstr ""

#. Tag: title
#: basic_mapping.xml:2462
#, no-c-format
msgid "Single table per class hierarchy strategy"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2464
#, no-c-format
msgid "With this approach the properties of all the subclasses in a given mapped class hierarchy are stored in a single table."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2467
#, no-c-format
msgid "Each subclass declares its own persistent properties and subclasses. Version and id properties are assumed to be inherited from the root class. Each subclass in a hierarchy must define a unique discriminator value. If this is not specified, the fully qualified Java class name is used."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2473 basic_mapping.xml:2581
#, no-c-format
msgid ""
      "@Entity\n"
      "@Inheritance(strategy=InheritanceType.SINGLE_TABLE)\n"
      "@DiscriminatorColumn(\n"
      "    name=\"planetype\",\n"
      "    discriminatorType=DiscriminatorType.STRING\n"
      ")\n"
      "@DiscriminatorValue(\"Plane\")\n"
      "public class Plane { ... }\n"
      "\n"
      "@Entity\n"
      "@DiscriminatorValue(\"A320\")\n"
      "public class A320 extends Plane { ... }"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2475
#, no-c-format
msgid "In hbm.xml, for the table-per-class-hierarchy mapping strategy, the <literal><subclass> declaration is used. For example:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2490
#, no-c-format
msgid ""
      "<subclass\n"
      "        name=\"ClassName\"\n"
      "        discriminator-value=\"discriminator_value\"\n"
      "        proxy=\"ProxyInterface\"\n"
      "        lazy=\"true|false\"\n"
      "        dynamic-update=\"true|false\"\n"
      "        dynamic-insert=\"true|false\"\n"
      "        entity-name=\"EntityName\"\n"
      "        node=\"element-name\"\n"
      "        extends=\"SuperclassName\">\n"
      "\n"
      "        <property .... />\n"
      "        .....\n"
      "</subclass>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2494 basic_mapping.xml:2692 basic_mapping.xml:2756
#, no-c-format
msgid "<literal>name: the fully qualified class name of the subclass."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2499
#, no-c-format
msgid "<literal>discriminator-value (optional - defaults to the class name): a value that distinguishes individual subclasses."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2505
#, no-c-format
msgid "<literal>proxy (optional): specifies a class or interface used for lazy initializing proxies."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2510
#, no-c-format
msgid "<literal>lazy (optional - defaults to true): setting lazy=\"false\" disables the use of lazy fetching."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2518 basic_mapping.xml:2721 basic_mapping.xml:2782
#, no-c-format
msgid "For information about inheritance mappings see <xref linkend=\"inheritance\"/>."
msgstr ""

#. Tag: title
#: basic_mapping.xml:2522
#, no-c-format
msgid "Discriminator"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2524
#, no-c-format
msgid "Discriminators are required for polymorphic persistence using the table-per-class-hierarchy mapping strategy. It declares a discriminator column of the table. The discriminator column contains marker values that tell the persistence layer what subclass to instantiate for a particular row. Hibernate Core supports the follwoing restricted set of types as discriminator column: <literal>string, character, integer, byte, short, boolean, yes_no, true_false."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2535
#, no-c-format
msgid "Use the <classname>@DiscriminatorColumn to define the discriminator column as well as the discriminator type.  The enum DiscriminatorType used in javax.persitence.DiscriminatorColumn only contains the values STRING, CHAR and INTEGER which means that not all Hibernate supported types are available via the @DiscriminatorColumn annotation. You can also use @DiscriminatorFormula to express in SQL a virtual discriminator column. This is particularly useful when the discriminator value can be extracted from one or more columns of the table. Both @DiscriminatorColumn and @DiscriminatorFormula are to be set on the root entity (once per persisted hierarchy)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2552
#, no-c-format
msgid "<classname>@org.hibernate.annotations.DiscriminatorOptions allows to optionally specify Hibernate specific discriminator options which are not standardized in JPA. The available options are force and insert. The force attribute is useful if the table contains rows with \"extra\" discriminator values that are not mapped to a persistent class. This could for example occur when working with a legacy database. If force is set to true Hibernate will specify the allowed discriminator values in the SELECT query, even when retrieving all instances of the root class. The second option - insert - tells Hibernate whether or not to include the discriminator column in SQL INSERTs. Usually the column should be part of the INSERT statement, but if your discriminator column is also part of a mapped composite identifier you have to set this option to false."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2569
#, no-c-format
msgid "There is also a <classname>@org.hibernate.annotations.ForceDiscriminator annotation which is deprecated since version 3.6. Use @DiscriminatorOptions instead."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2575
#, no-c-format
msgid "Finally, use <classname>@DiscriminatorValue on each class of the hierarchy to specify the value stored in the discriminator column for a given entity. If you do not set @DiscriminatorValue on a class, the fully qualified class name is used."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2583
#, no-c-format
msgid "In hbm.xml, the <literal><discriminator> element is used to define the discriminator column or formula:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2600
#, no-c-format
msgid ""
      "<discriminator\n"
      "        column=\"discriminator_column\"\n"
      "        type=\"discriminator_type\"\n"
      "        force=\"true|false\"\n"
      "        insert=\"true|false\"\n"
      "        formula=\"arbitrary sql expression\"\n"
      "/>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2604
#, no-c-format
msgid "<literal>column (optional - defaults to class): the name of the discriminator column."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2610
#, no-c-format
msgid "<literal>type (optional - defaults to string): a name that indicates the Hibernate type"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2616
#, no-c-format
msgid "<literal>force (optional - defaults to false): \"forces\" Hibernate to specify the allowed discriminator values, even when retrieving all instances of the root class."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2623
#, no-c-format
msgid "<literal>insert (optional - defaults to true): set this to false if your discriminator column is also part of a mapped composite identifier. It tells Hibernate not to include the column in SQL INSERTs."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2631
#, no-c-format
msgid "<literal>formula (optional): an arbitrary SQL expression that is executed when a type has to be evaluated. It allows content-based discrimination."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2638
#, no-c-format
msgid "Actual values of the discriminator column are specified by the <literal>discriminator-value attribute of the <class> and <subclass> elements."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2643
#, no-c-format
msgid "The <literal>formula attribute allows you to declare an arbitrary SQL expression that will be used to evaluate the type of a row. For example:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2647
#, no-c-format
msgid ""
      "<discriminator\n"
      "    formula=\"case when CLASS_TYPE in ('a', 'b', 'c') then 0 else 1 end\"\n"
      "    type=\"integer\"/>"
msgstr ""

#. Tag: title
#: basic_mapping.xml:2652
#, no-c-format
msgid "Joined subclass strategy"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2654
#, no-c-format
msgid "Each subclass can also be mapped to its own table. This is called the table-per-subclass mapping strategy. An inherited state is retrieved by joining with the table of the superclass. A discriminator column is not required for this mapping strategy. Each subclass must, however, declare a table column holding the object identifier. The primary key of this table is also a foreign key to the superclass table and described by the <classname>@PrimaryKeyJoinColumns or the <key> element."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2664
#, no-c-format
msgid ""
      "@Entity @Table(name=\"CATS\")\n"
      "@Inheritance(strategy=InheritanceType.JOINED)\n"
      "public class Cat implements Serializable { \n"
      "    @Id @GeneratedValue(generator=\"cat-uuid\") \n"
      "    @GenericGenerator(name=\"cat-uuid\", strategy=\"uuid\")\n"
      "    String getId() { return id; }\n"
      "\n"
      "    ...\n"
      "}\n"
      "\n"
      "@Entity @Table(name=\"DOMESTIC_CATS\")\n"
      "@PrimaryKeyJoinColumn(name=\"CAT\")\n"
      "public class DomesticCat extends Cat { \n"
      "    public String getName() { return name; }\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2667
#, no-c-format
msgid "The table name still defaults to the non qualified class name. Also if <classname>@PrimaryKeyJoinColumn is not set, the primary key / foreign key columns are assumed to have the same names as the primary key columns of the primary table of the superclass."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2674
#, no-c-format
msgid "In hbm.xml, use the <literal><joined-subclass> element. For example:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2688
#, no-c-format
msgid ""
      "<joined-subclass\n"
      "        name=\"ClassName\"\n"
      "        table=\"tablename\"\n"
      "        proxy=\"ProxyInterface\"\n"
      "        lazy=\"true|false\"\n"
      "        dynamic-update=\"true|false\"\n"
      "        dynamic-insert=\"true|false\"\n"
      "        schema=\"schema\"\n"
      "        catalog=\"catalog\"\n"
      "        extends=\"SuperclassName\"\n"
      "        persister=\"ClassName\"\n"
      "        subselect=\"SQL expression\"\n"
      "        entity-name=\"EntityName\"\n"
      "        node=\"element-name\">\n"
      "\n"
      "        <key .... >\n"
      "\n"
      "        <property .... />\n"
      "        .....\n"
      "</joined-subclass>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2697 basic_mapping.xml:2761
#, no-c-format
msgid "<literal>table: the name of the subclass table."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2702 basic_mapping.xml:2766
#, no-c-format
msgid "<literal>proxy (optional): specifies a class or interface to use for lazy initializing proxies."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2707 basic_mapping.xml:2771
#, no-c-format
msgid "<literal>lazy (optional, defaults to true): setting lazy=\"false\" disables the use of lazy fetching."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2715
#, no-c-format
msgid "Use the <literal><key> element to declare the primary key / foreign key column. The mapping at the start of the chapter would then be re-written as:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2719
#, no-c-format
msgid ""
      "<?xml version=\"1.0\"?>\n"
      "<!DOCTYPE hibernate-mapping PUBLIC\n"
      "        \"-//Hibernate/Hibernate Mapping DTD//EN\"\n"
      "        \"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd\">\n"
      "\n"
      "<hibernate-mapping package=\"eg\">\n"
      "\n"
      "        <class name=\"Cat\" table=\"CATS\">\n"
      "                <id name=\"id\" column=\"uid\" type=\"long\">\n"
      "                        <generator class=\"hilo\"/>\n"
      "                </id>\n"
      "                <property name=\"birthdate\" type=\"date\"/>\n"
      "                <property name=\"color\" not-null=\"true\"/>\n"
      "                <property name=\"sex\" not-null=\"true\"/>\n"
      "                <property name=\"weight\"/>\n"
      "                <many-to-one name=\"mate\"/>\n"
      "                <set name=\"kittens\">\n"
      "                        <key column=\"MOTHER\"/>\n"
      "                        <one-to-many class=\"Cat\"/>\n"
      "                </set>\n"
      "                <joined-subclass name=\"DomesticCat\" table=\"DOMESTIC_CATS\">\n"
      "                    <key column=\"CAT\"/>\n"
      "                    <property name=\"name\" type=\"string\"/>\n"
      "                </joined-subclass>\n"
      "        </class>\n"
      "\n"
      "        <class name=\"eg.Dog\">\n"
      "                <!-- mapping for Dog could go here -->\n"
      "        </class>\n"
      "\n"
      "</hibernate-mapping>"
msgstr ""

#. Tag: title
#: basic_mapping.xml:2726
#, no-c-format
msgid "Table per class strategy"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2728
#, no-c-format
msgid "A third option is to map only the concrete classes of an inheritance hierarchy to tables. This is called the table-per-concrete-class strategy. Each table defines all persistent states of the class, including the inherited state. In Hibernate, it is not necessary to explicitly map such inheritance hierarchies. You can map each class as a separate entity root. However, if you wish use polymorphic associations (e.g. an association to the superclass of your hierarchy), you need to use the union subclass mapping."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2737
#, no-c-format
msgid ""
      "@Entity\n"
      "@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)\n"
      "public class Flight implements Serializable { ... }"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2739
#, no-c-format
msgid "Or in hbm.xml:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2752
#, no-c-format
msgid ""
      "<union-subclass\n"
      "        name=\"ClassName\"\n"
      "        table=\"tablename\"\n"
      "        proxy=\"ProxyInterface\"\n"
      "        lazy=\"true|false\"\n"
      "        dynamic-update=\"true|false\"\n"
      "        dynamic-insert=\"true|false\"\n"
      "        schema=\"schema\"\n"
      "        catalog=\"catalog\"\n"
      "        extends=\"SuperclassName\"\n"
      "        abstract=\"true|false\"\n"
      "        persister=\"ClassName\"\n"
      "        subselect=\"SQL expression\"\n"
      "        entity-name=\"EntityName\"\n"
      "        node=\"element-name\">\n"
      "\n"
      "        <property .... />\n"
      "        .....\n"
      "</union-subclass>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2779
#, no-c-format
msgid "No discriminator column or key column is required for this mapping strategy."
msgstr ""

#. Tag: title
#: basic_mapping.xml:2787
#, no-c-format
msgid "Inherit properties from superclasses"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2789
#, no-c-format
msgid "This is sometimes useful to share common properties through a technical or a business superclass without including it as a regular mapped entity (ie no specific table for this entity). For that purpose you can map them as <literal>@MappedSuperclass."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2794
#, no-c-format
msgid ""
      "@MappedSuperclass\n"
      "public class BaseEntity {\n"
      "    @Basic\n"
      "    @Temporal(TemporalType.TIMESTAMP)\n"
      "    public Date getLastUpdate() { ... }\n"
      "    public String getLastUpdater() { ... }\n"
      "    ...\n"
      "}\n"
      "\n"
      "@Entity class Order extends BaseEntity {\n"
      "    @Id public Integer getId() { ... }\n"
      "    ...\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2796
#, no-c-format
msgid "In database, this hierarchy will be represented as an <literal>Order table having the id, lastUpdate and lastUpdater columns. The embedded superclass property mappings are copied into their entity subclasses. Remember that the embeddable superclass is not the root of the hierarchy though."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2804
#, no-c-format
msgid "Properties from superclasses not mapped as <literal>@MappedSuperclass are ignored."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2809
#, no-c-format
msgid "The default access type (field or methods) is used, unless you use the <literal>@Access annotation."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2814
#, no-c-format
msgid "The same notion can be applied to <literal>@Embeddable objects to persist properties from their superclasses. You also need to use @MappedSuperclass to do that (this should not be considered as a standard EJB3 feature though)"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2822
#, no-c-format
msgid "It is allowed to mark a class as <literal>@MappedSuperclass in the middle of the mapped inheritance hierarchy."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2828
#, no-c-format
msgid "Any class in the hierarchy non annotated with <literal>@MappedSuperclass nor @Entity will be ignored."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2833
#, no-c-format
msgid "You can override columns defined in entity superclasses at the root entity level using the <literal>@AttributeOverride annotation."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2837
#, no-c-format
msgid ""
      "@MappedSuperclass\n"
      "public class FlyingObject implements Serializable {\n"
      "\n"
      "    public int getAltitude() {\n"
      "        return altitude;\n"
      "    }\n"
      "\n"
      "    @Transient\n"
      "    public int getMetricAltitude() {\n"
      "        return metricAltitude;\n"
      "    }\n"
      "\n"
      "    @ManyToOne\n"
      "    public PropulsionType getPropulsion() {\n"
      "        return metricAltitude;\n"
      "    }\n"
      "    ...\n"
      "}\n"
      "\n"
      "@Entity\n"
      "@AttributeOverride( name=\"altitude\", column = @Column(name=\"fld_altitude\") )\n"
      "@AssociationOverride( \n"
      "   name=\"propulsion\", \n"
      "   joinColumns = @JoinColumn(name=\"fld_propulsion_fk\") \n"
      ")\n"
      "public class Plane extends FlyingObject {\n"
      "    ...\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2839
#, no-c-format
msgid "The <literal>altitude property will be persisted in an fld_altitude column of table Plane and the propulsion association will be materialized in a fld_propulsion_fk foreign key column."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2845
#, no-c-format
msgid "You can define <literal>@AttributeOverride(s) and @AssociationOverride(s) on @Entity classes, @MappedSuperclass classes and properties pointing to an @Embeddable object."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2851
#, no-c-format
msgid "In hbm.xml, simply map the properties of the superclass in the <literal><class> element of the entity that needs to inherit them."
msgstr ""

#. Tag: title
#: basic_mapping.xml:2857
#, no-c-format
msgid "Mapping one entity to several tables"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2859
#, no-c-format
msgid "While not recommended for a fresh schema, some legacy databases force your to map a single entity on several tables."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2862
#, no-c-format
msgid "Using the <literal>@SecondaryTable or @SecondaryTables class level annotations. To express that a column is in a particular table, use the table parameter of @Column or @JoinColumn."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2868
#, no-c-format
msgid ""
      "@Entity\n"
      "@Table(name=\"MainCat\")\n"
      "@SecondaryTables({\n"
      "    @SecondaryTable(name=\"Cat1\", pkJoinColumns={\n"
      "        @PrimaryKeyJoinColumn(name=\"cat_id\", referencedColumnName=\"id\")\n"
      "    ),\n"
      "    @SecondaryTable(name=\"Cat2\", uniqueConstraints={@UniqueConstraint(columnNames={\"storyPart2\"})})\n"
      "})\n"
      "public class Cat implements Serializable {\n"
      "\n"
      "    private Integer id;\n"
      "    private String name;\n"
      "    private String storyPart1;\n"
      "    private String storyPart2;\n"
      "\n"
      "    @Id @GeneratedValue\n"
      "    public Integer getId() {\n"
      "        return id;\n"
      "    }\n"
      "\n"
      "    public String getName() {\n"
      "        return name;\n"
      "    }\n"
      "    \n"
      "    @Column(table=\"Cat1\")\n"
      "    public String getStoryPart1() {\n"
      "        return storyPart1;\n"
      "    }\n"
      "\n"
      "    @Column(table=\"Cat2\")\n"
      "    public String getStoryPart2() {\n"
      "        return storyPart2;\n"
      "    }\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2870
#, no-c-format
msgid "In this example, <literal>name will be in MainCat. storyPart1 will be in Cat1 and storyPart2 will be in Cat2. Cat1 will be joined to MainCat using the cat_id as a foreign key, and Cat2 using id (ie the same column name, the MainCat id column has). Plus a unique constraint on storyPart2 has been set."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2880
#, no-c-format
msgid "There is also additional tuning accessible via the <classname>@org.hibernate.annotations.Table annotation:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2886
#, no-c-format
msgid "<literal>fetch: If set to JOIN, the default, Hibernate will use an inner join to retrieve a secondary table defined by a class or its superclasses and an outer join for a secondary table defined by a subclass. If set to SELECT then Hibernate will use a sequential select for a secondary table defined on a subclass, which will be issued only if a row turns out to represent an instance of the subclass. Inner joins will still be used to retrieve a secondary defined by the class and its superclasses."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2898
#, no-c-format
msgid "<literal>inverse: If true, Hibernate will not try to insert or update the properties defined by this join. Default to false."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2904
#, no-c-format
msgid "<literal>optional: If enabled (the default), Hibernate will insert a row only if the properties defined by this join are non-null and will always use an outer join to retrieve the properties."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2911
#, no-c-format
msgid "<literal>foreignKey: defines the Foreign Key name of a secondary table pointing back to the primary table."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2916
#, no-c-format
msgid "Make sure to use the secondary table name in the <methodname>appliesto property"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2919
#, no-c-format
msgid ""
      "@Entity\n"
      "@Table(name=\"MainCat\")\n"
      "@SecondaryTable(name=\"Cat1\")\n"
      "@org.hibernate.annotations.Table(\n"
      "   appliesTo=\"Cat1\",\n"
      "   fetch=FetchMode.SELECT,\n"
      "   optional=true)\n"
      "public class Cat implements Serializable {\n"
      "\n"
      "    private Integer id;\n"
      "    private String name;\n"
      "    private String storyPart1;\n"
      "    private String storyPart2;\n"
      "\n"
      "    @Id @GeneratedValue\n"
      "    public Integer getId() {\n"
      "        return id;\n"
      "    }\n"
      "\n"
      "    public String getName() {\n"
      "        return name;\n"
      "    }\n"
      "    \n"
      "    @Column(table=\"Cat1\")\n"
      "    public String getStoryPart1() {\n"
      "        return storyPart1;\n"
      "    }\n"
      "\n"
      "    @Column(table=\"Cat2\")\n"
      "    public String getStoryPart2() {\n"
      "        return storyPart2;\n"
      "    }\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2921
#, no-c-format
msgid "In hbm.xml, use the <literal><join> element."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2939
#, no-c-format
msgid ""
      "<join\n"
      "        table=\"tablename\"\n"
      "        schema=\"owner\"\n"
      "        catalog=\"catalog\"\n"
      "        fetch=\"join|select\"\n"
      "        inverse=\"true|false\"\n"
      "        optional=\"true|false\">\n"
      "\n"
      "        <key ... />\n"
      "\n"
      "        <property ... />\n"
      "        ...\n"
      "</join>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:2943
#, no-c-format
msgid "<literal>table: the name of the joined table."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2960
#, no-c-format
msgid "<literal>fetch (optional - defaults to join): if set to join, the default, Hibernate will use an inner join to retrieve a <join> defined by a class or its superclasses. It will use an outer join for a <join> defined by a subclass. If set to select then Hibernate will use a sequential select for a <join> defined on a subclass. This will be issued only if a row represents an instance of the subclass. Inner joins will still be used to retrieve a <join> defined by the class and its superclasses."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2975
#, no-c-format
msgid "<literal>inverse (optional - defaults to false): if enabled, Hibernate will not insert or update the properties defined by this join."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2981
#, no-c-format
msgid "<literal>optional (optional - defaults to false): if enabled, Hibernate will insert a row only if the properties defined by this join are non-null. It will always use an outer join to retrieve the properties."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2989
#, no-c-format
msgid "For example, address information for a person can be mapped to a separate table while preserving value type semantics for all properties:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:2993
#, no-c-format
msgid ""
      "<class name=\"Person\"\n"
      "    table=\"PERSON\">\n"
      "\n"
      "    <id name=\"id\" column=\"PERSON_ID\">...</id>\n"
      "\n"
      "    <join table=\"ADDRESS\">\n"
      "        <key column=\"ADDRESS_ID\"/>\n"
      "        <property name=\"address\"/>\n"
      "        <property name=\"zip\"/>\n"
      "        <property name=\"country\"/>\n"
      "    </join>\n"
      "    ..."
msgstr ""

#. Tag: para
#: basic_mapping.xml:2995
#, no-c-format
msgid "This feature is often only useful for legacy data models. We recommend fewer tables than classes and a fine-grained domain model. However, it is useful for switching between inheritance mapping strategies in a single hierarchy, as explained later."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3003
#, no-c-format
msgid "Mapping one to one and one to many associations"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3005
#, no-c-format
msgid "To link one entity to an other, you need to map the association property as a to one association. In the relational model, you can either use a foreign key or an association table, or (a bit less common) share the same primary key value between the two entities."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3010
#, no-c-format
msgid "To mark an association, use either <classname>@ManyToOne or @OnetoOne."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3014
#, no-c-format
msgid "<literal>@ManyToOne and @OneToOne have a parameter named targetEntity which describes the target entity name. You usually don't need this parameter since the default value (the type of the property that stores the association) is good in almost all cases. However this is useful when you want to use interfaces as the return type instead of the regular entity."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3021
#, no-c-format
msgid "Setting a value of the <literal>cascade attribute to any meaningful value other than nothing will propagate certain operations to the associated object. The meaningful values are divided into three categories."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3028
#, no-c-format
msgid "basic operations, which include: <literal>persist, merge, delete, save-update, evict, replicate, lock and refresh;"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3034
#, no-c-format
msgid "special values: <literal>delete-orphan or all ;"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3039
#, no-c-format
msgid "comma-separated combinations of operation names: <literal>cascade=\"persist,merge,evict\" or cascade=\"all,delete-orphan\". See  for a full explanation. Note that single valued many-to-one associations do not support orphan delete."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3048
#, no-c-format
msgid "By default, single point associations are eagerly fetched in JPA 2. You can mark it as lazily fetched by using <classname>@ManyToOne(fetch=FetchType.LAZY) in which case Hibernate will proxy the association and load it when the state of the associated entity is reached. You can force Hibernate not to use a proxy by using @LazyToOne(NO_PROXY). In this case, the property is fetched lazily when the instance variable is first accessed. This requires build-time bytecode instrumentation. lazy=\"false\" specifies that the association will always be eagerly fetched."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3058
#, no-c-format
msgid "With the default JPA options, single-ended associations are loaded with a subsequent select if set to <literal>LAZY, or a SQL JOIN is used for EAGER associations. You can however adjust the fetching strategy, ie how data is fetched by using @Fetch. FetchMode can be SELECT (a select is triggered when the association needs to be loaded) or JOIN (use a SQL JOIN to load the association while loading the owner entity). JOIN overrides any lazy attribute (an association loaded through a JOIN strategy cannot be lazy)."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3070
#, no-c-format
msgid "Using a foreign key or an association table"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3072
#, no-c-format
msgid "An ordinary association to another persistent class is declared using a"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3077
#, no-c-format
msgid "<classname>@ManyToOne if several entities can point to the the target entity"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3082
#, no-c-format
msgid "<classname>@OneToOne if only a single entity can point to the the target entity"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3087
#, no-c-format
msgid "and a foreign key in one table is referencing the primary key column(s) of the target table."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3090
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Flight implements Serializable {\n"
      "    @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )\n"
      "    @JoinColumn(name=\"COMP_ID\")\n"
      "    public Company getCompany() {\n"
      "        return company;\n"
      "    }\n"
      "    ...\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3092
#, no-c-format
msgid "The <literal>@JoinColumn attribute is optional, the default value(s) is the concatenation of the name of the relationship in the owner side, _ (underscore), and the name of the primary key column in the owned side. In this example company_id because the property name is company and the column id of Company is id."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3100
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Flight implements Serializable {\n"
      "    @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, targetEntity=CompanyImpl.class )\n"
      "    @JoinColumn(name=\"COMP_ID\")\n"
      "    public Company getCompany() {\n"
      "        return company;\n"
      "    }\n"
      "    ...\n"
      "}\n"
      "\n"
      "public interface Company {\n"
      "    ...\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3102
#, no-c-format
msgid "You can also map a to one association through an association table. This association table described by the <literal>@JoinTable annotation will contains a foreign key referencing back the entity table (through @JoinTable.joinColumns) and a a foreign key referencing the target entity table (through @JoinTable.inverseJoinColumns)."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3110
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Flight implements Serializable {\n"
      "    @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )\n"
      "    @JoinTable(name=\"Flight_Company\",\n"
      "        joinColumns = @JoinColumn(name=\"FLIGHT_ID\"),\n"
      "        inverseJoinColumns = @JoinColumn(name=\"COMP_ID\")\n"
      "    )\n"
      "    public Company getCompany() {\n"
      "        return company;\n"
      "    }\n"
      "    ...\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3113
#, no-c-format
msgid "You can use a SQL fragment to simulate a physical join column using the <classname>@JoinColumnOrFormula / @JoinColumnOrformulas annotations (just like you can use a SQL fragment to simulate a property column via the @Formula annotation)."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3119
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Ticket implements Serializable {\n"
      "    @ManyToOne\n"
      "    @JoinColumnOrFormula(formula=\"(firstname + ' ' + lastname)\")\n"
      "    public Person getOwner() {\n"
      "        return person;\n"
      "    }\n"
      "    ...\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3122
#, no-c-format
msgid "You can mark an association as mandatory by using the <literal>optional=false attribute. We recommend to use Bean Validation's @NotNull annotation as a better alternative however. As a consequence, the foreign key column(s) will be marked as not nullable (if possible)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3128
#, no-c-format
msgid "When Hibernate cannot resolve the association because the expected associated element is not in database (wrong id on the association column), an exception is raised. This might be inconvenient for legacy and badly maintained schemas. You can ask Hibernate to ignore such elements instead of raising an exception using the <literal>@NotFound annotation."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3136
#, no-c-format
msgid "@NotFound annotation"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3138
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Child {\n"
      "    ...\n"
      "    @ManyToOne\n"
      "    @NotFound(action=NotFoundAction.IGNORE)\n"
      "    public Parent getParent() { ... }\n"
      "    ...\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3141
#, no-c-format
msgid "Sometimes you want to delegate to your database the deletion of cascade when a given entity is deleted. In this case Hibernate generates a cascade delete constraint at the database level."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3146
#, no-c-format
msgid "@OnDelete annotation"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3148
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Child {\n"
      "    ...\n"
      "    @ManyToOne\n"
      "    @OnDelete(action=OnDeleteAction.CASCADE)\n"
      "    public Parent getParent() { ... }\n"
      "    ...\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3151
#, no-c-format
msgid "Foreign key constraints, while generated by Hibernate, have a fairly unreadable name. You can override the constraint name using <literal>@ForeignKey."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3156
#, no-c-format
msgid "@ForeignKey annotation"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3158
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Child {\n"
      "    ...\n"
      "    @ManyToOne\n"
      "    @ForeignKey(name=\"FK_PARENT\")\n"
      "    public Parent getParent() { ... }\n"
      "    ...\n"
      "}\n"
      "\n"
      "alter table Child add constraint FK_PARENT foreign key (parent_id) references Parent"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3161
#, no-c-format
msgid "Sometimes, you want to link one entity to an other not by the target entity primary key but by a different unique key. You can achieve that by referencing the unique key column(s) in <methodname>@JoinColumn.referenceColumnName."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3166 basic_mapping.xml:3718
#, no-c-format
msgid ""
      "@Entity\n"
      "class Person {\n"
      "   @Id Integer personNumber;\n"
      "   String firstName;\n"
      "   @Column(name=\"I\")\n"
      "   String initial;\n"
      "   String lastName;\n"
      "}\n"
      "\n"
      "@Entity\n"
      "class Home {\n"
      "   @ManyToOne\n"
      "   @JoinColumns({\n"
      "      @JoinColumn(name=\"first_name\", referencedColumnName=\"firstName\"),\n"
      "      @JoinColumn(name=\"init\", referencedColumnName=\"I\"),\n"
      "      @JoinColumn(name=\"last_name\", referencedColumnName=\"lastName\"),\n"
      "   })\n"
      "   Person owner\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3168
#, no-c-format
msgid "This is not encouraged however and should be reserved to legacy mappings."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3171
#, no-c-format
msgid "In hbm.xml, mapping an association is similar. The main difference is that a <classname>@OneToOne is mapped as <many-to-one unique=\"true\"/>, let's dive into the subject."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3213
#, no-c-format
msgid ""
      "<many-to-one\n"
      "        name=\"propertyName\"\n"
      "        column=\"column_name\"\n"
      "        class=\"ClassName\"\n"
      "        cascade=\"cascade_style\"\n"
      "        fetch=\"join|select\"\n"
      "        update=\"true|false\"\n"
      "        insert=\"true|false\"\n"
      "        property-ref=\"propertyNameFromAssociatedClass\"\n"
      "        access=\"field|property|ClassName\"\n"
      "        unique=\"true|false\"\n"
      "        not-null=\"true|false\"\n"
      "        optimistic-lock=\"true|false\"\n"
      "        lazy=\"proxy|no-proxy|false\"\n"
      "        not-found=\"ignore|exception\"\n"
      "        entity-name=\"EntityName\"\n"
      "        formula=\"arbitrary SQL expression\"\n"
      "        node=\"element-name|@attribute-name|element/@attribute|.\"\n"
      "        embed-xml=\"true|false\"\n"
      "        index=\"index_name\"\n"
      "        unique_key=\"unique_key_id\"\n"
      "        foreign-key=\"foreign_key_name\"\n"
      "/>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3221 basic_mapping.xml:3904
#, no-c-format
msgid "<literal>column (optional): the name of the foreign key column. This can also be specified by nested <column> element(s)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3227 basic_mapping.xml:3421
#, no-c-format
msgid "<literal>class (optional - defaults to the property type determined by reflection): the name of the associated class."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3233 basic_mapping.xml:3427
#, no-c-format
msgid "<literal>cascade (optional): specifies which operations should be cascaded from the parent object to the associated object."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3239 basic_mapping.xml:3443
#, no-c-format
msgid "<literal>fetch (optional - defaults to select): chooses between outer-join fetching or sequential select fetching."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3245
#, no-c-format
msgid "<literal>update, insert (optional - defaults to true): specifies that the mapped columns should be included in SQL UPDATE and/or INSERT statements. Setting both to false allows a pure \"derived\" association whose value is initialized from another property that maps to the same column(s), or by a trigger or other application."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3255
#, no-c-format
msgid "<literal>property-ref (optional): the name of a property of the associated class that is joined to this foreign key. If not specified, the primary key of the associated class is used."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3268
#, no-c-format
msgid "<literal>unique (optional): enables the DDL generation of a unique constraint for the foreign-key column. By allowing this to be the target of a property-ref, you can make the association multiplicity one-to-one."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3276
#, no-c-format
msgid "<literal>not-null (optional): enables the DDL generation of a nullability constraint for the foreign key columns."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3290
#, no-c-format
msgid "<literal>lazy (optional - defaults to proxy): by default, single point associations are proxied. lazy=\"no-proxy\" specifies that the property should be fetched lazily when the instance variable is first accessed. This requires build-time bytecode instrumentation. lazy=\"false\" specifies that the association will always be eagerly fetched."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3300
#, no-c-format
msgid "<literal>not-found (optional - defaults to exception): specifies how foreign keys that reference missing rows will be handled. ignore will treat a missing row as a null association."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3308 basic_mapping.xml:3484
#, no-c-format
msgid "<literal>entity-name (optional): the entity name of the associated class."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3313
#, no-c-format
msgid "<literal>formula (optional): an SQL expression that defines the value for a computed foreign key."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3320
#, no-c-format
msgid "Setting a value of the <literal>cascade attribute to any meaningful value other than none will propagate certain operations to the associated object. The meaningful values are divided into three categories. First, basic operations, which include: persist, merge, delete, save-update, evict, replicate, lock and refresh; second, special values: delete-orphan; and third,all comma-separated combinations of operation names: cascade=\"persist,merge,evict\" or cascade=\"all,delete-orphan\". See  for a full explanation. Note that single valued, many-to-one and one-to-one, associations do not support orphan delete."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3334
#, no-c-format
msgid "Here is an example of a typical <literal>many-to-one declaration:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3337
#, no-c-format
msgid "<many-to-one name=\"product\" class=\"Product\" column=\"PRODUCT_ID\"/>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3339
#, no-c-format
msgid "The <literal>property-ref attribute should only be used for mapping legacy data where a foreign key refers to a unique key of the associated table other than the primary key. This is a complicated and confusing relational model. For example, if the Product class had a unique serial number that is not the primary key. The unique attribute controls Hibernate's DDL generation with the SchemaExport tool."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3347
#, no-c-format
msgid "<property name=\"serialNumber\" unique=\"true\" type=\"string\" column=\"SERIAL_NUMBER\"/>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3349
#, no-c-format
msgid "Then the mapping for <literal>OrderItem might use:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3352
#, no-c-format
msgid "<many-to-one name=\"product\" property-ref=\"serialNumber\" column=\"PRODUCT_SERIAL_NUMBER\"/>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3354
#, no-c-format
msgid "This is not encouraged, however."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3356
#, no-c-format
msgid "If the referenced unique key comprises multiple properties of the associated entity, you should map the referenced properties inside a named <literal><properties> element."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3360
#, no-c-format
msgid "If the referenced unique key is the property of a component, you can specify a property path:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3363
#, no-c-format
msgid "<many-to-one name=\"owner\" property-ref=\"identity.ssn\" column=\"OWNER_SSN\"/>"
msgstr ""

#. Tag: title
#: basic_mapping.xml:3367
#, no-c-format
msgid "Sharing the primary key with the associated entity"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3369
#, no-c-format
msgid "The second approach is to ensure an entity and its associated entity share the same primary key. In this case the primary key column is also a foreign key and there is no extra column. These associations are always one to one."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3375
#, no-c-format
msgid "One to One association"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3377
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Body {\n"
      "    @Id\n"
      "    public Long getId() { return id; }\n"
      "\n"
      "    @OneToOne(cascade = CascadeType.ALL)\n"
      "    @MapsId\n"
      "    public Heart getHeart() {\n"
      "        return heart;\n"
      "    }\n"
      "    ...\n"
      "}   \n"
      "\n"
      "@Entity\n"
      "public class Heart {\n"
      "    @Id\n"
      "    public Long getId() { ...}\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3381
#, no-c-format
msgid "Many people got confused by these primary key based one to one associations. They can only be lazily loaded if Hibernate knows that the other side of the association is always present. To indicate to Hibernate that it is the case, use <classname>@OneToOne(optional=false)."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3388
#, no-c-format
msgid "In hbm.xml, use the following mapping."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3413
#, no-c-format
msgid ""
      "<one-to-one\n"
      "        name=\"propertyName\"\n"
      "        class=\"ClassName\"\n"
      "        cascade=\"cascade_style\"\n"
      "        constrained=\"true|false\"\n"
      "        fetch=\"join|select\"\n"
      "        property-ref=\"propertyNameFromAssociatedClass\"\n"
      "        access=\"field|property|ClassName\"\n"
      "        formula=\"any SQL expression\"\n"
      "        lazy=\"proxy|no-proxy|false\"\n"
      "        entity-name=\"EntityName\"\n"
      "        node=\"element-name|@attribute-name|element/@attribute|.\"\n"
      "        embed-xml=\"true|false\"\n"
      "        foreign-key=\"foreign_key_name\"\n"
      "/>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3433
#, no-c-format
msgid "<literal>constrained (optional): specifies that a foreign key constraint on the primary key of the mapped table and references the table of the associated class. This option affects the order in which save() and delete() are cascaded, and determines whether the association can be proxied. It is also used by the schema export tool."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3449
#, no-c-format
msgid "<literal>property-ref (optional): the name of a property of the associated class that is joined to the primary key of this class. If not specified, the primary key of the associated class is used."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3462
#, no-c-format
msgid "<literal>formula (optional): almost all one-to-one associations map to the primary key of the owning entity. If this is not the case, you can specify another column, columns or expression to join on using an SQL formula. See org.hibernate.test.onetooneformula for an example."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3471
#, no-c-format
msgid "<literal>lazy (optional - defaults to proxy): by default, single point associations are proxied. lazy=\"no-proxy\" specifies that the property should be fetched lazily when the instance variable is first accessed. It requires build-time bytecode instrumentation. lazy=\"false\" specifies that the association will always be eagerly fetched. Note that if constrained=\"false\", proxying is impossible and Hibernate will eagerly fetch the association."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3490
#, no-c-format
msgid "Primary key associations do not need an extra table column. If two rows are related by the association, then the two table rows share the same primary key value. To relate two objects by a primary key association, ensure that they are assigned the same identifier value."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3496
#, no-c-format
msgid "For a primary key association, add the following mappings to <literal>Employee and Person respectively:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3500
#, no-c-format
msgid "<one-to-one name=\"person\" class=\"Person\"/>"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3502
#, no-c-format
msgid "<one-to-one name=\"employee\" class=\"Employee\" constrained=\"true\"/>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3504
#, no-c-format
msgid "Ensure that the primary keys of the related rows in the PERSON and EMPLOYEE tables are equal. You use a special Hibernate identifier generation strategy called <literal>foreign:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3508
#, no-c-format
msgid ""
      "<class name=\"person\" table=\"PERSON\">\n"
      "    <id name=\"id\" column=\"PERSON_ID\">\n"
      "        <generator class=\"foreign\">\n"
      "            <param name=\"property\">employee</param>\n"
      "        </generator>\n"
      "    </id>\n"
      "    ...\n"
      "    <one-to-one name=\"employee\"\n"
      "        class=\"Employee\"\n"
      "        constrained=\"true\"/>\n"
      "</class>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3510
#, no-c-format
msgid "A newly saved instance of <literal>Person is assigned the same primary key value as the Employee instance referred with the employee property of that Person."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3518
#, no-c-format
msgid "Natural-id"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3520
#, no-c-format
msgid "Although we recommend the use of surrogate keys as primary keys, you should try to identify natural keys for all entities. A natural key is a property or combination of properties that is unique and non-null. It is also immutable. Map the properties of the natural key as <classname>@NaturalId or map them inside the <natural-id> element. Hibernate will generate the necessary unique key and nullability constraints and, as a result, your mapping will be more self-documenting."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3529
#, no-c-format
msgid ""
      "@Entity\n"
      "public class Citizen {\n"
      "    @Id\n"
      "    @GeneratedValue\n"
      "    private Integer id;\n"
      "    private String firstname;\n"
      "    private String lastname;\n"
      "    \n"
      "    @NaturalId\n"
      "    @ManyToOne\n"
      "    private State state;\n"
      "\n"
      "    @NaturalId\n"
      "    private String ssn;\n"
      "    ...\n"
      "}\n"
      "\n"
      "\n"
      "\n"
      "//and later on query\n"
      "List results = s.createCriteria( Citizen.class )\n"
      "                .add( Restrictions.naturalId().set( \"ssn\", \"1234\" ).set( \"state\", ste ) )\n"
      "                .list();"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3531
#, no-c-format
msgid "Or in XML,"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3533
#, no-c-format
msgid ""
      "<natural-id mutable=\"true|false\"/>\n"
      "        <property ... />\n"
      "        <many-to-one ... />\n"
      "        ......\n"
      "</natural-id>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3535
#, no-c-format
msgid "It is recommended that you implement <literal>equals() and hashCode() to compare the natural key properties of the entity."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3539
#, no-c-format
msgid "This mapping is not intended for use with entities that have natural primary keys."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3544
#, no-c-format
msgid "<literal>mutable (optional - defaults to false): by default, natural identifier properties are assumed to be immutable (constant)."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3552
#, no-c-format
msgid "<title>Any"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3554
#, no-c-format
msgid "There is one more type of property mapping. The <classname>@Any mapping defines a polymorphic association to classes from multiple tables. This type of mapping requires more than one column. The first column contains the type of the associated entity. The remaining columns contain the identifier. It is impossible to specify a foreign key constraint for this kind of association. This is not the usual way of mapping polymorphic associations and you should use this only in special cases. For example, for audit logs, user session data, etc."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3564
#, no-c-format
msgid "The <classname>@Any annotation describes the column holding the metadata information. To link the value of the metadata information and an actual entity type, The @AnyDef and @AnyDefs annotations are used. The metaType attribute allows the application to specify a custom type that maps database column values to persistent classes that have identifier properties of the type specified by idType. You must specify the mapping from values of the metaType to class names."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3574
#, no-c-format
msgid ""
      "@Any( metaColumn = @Column( name = \"property_type\" ), fetch=FetchType.EAGER )\n"
      "@AnyMetaDef( \n"
      "    idType = \"integer\", \n"
      "    metaType = \"string\", \n"
      "    metaValues = {\n"
      "        @MetaValue( value = \"S\", targetEntity = StringProperty.class ),\n"
      "        @MetaValue( value = \"I\", targetEntity = IntegerProperty.class )\n"
      "    } )\n"
      "@JoinColumn( name = \"property_id\" )\n"
      "public Property getMainProperty() {\n"
      "    return mainProperty;\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3576
#, no-c-format
msgid "Note that <classname>@AnyDef can be mutualized and reused. It is recommended to place it as a package metadata in this case."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3580
#, no-c-format
msgid ""
      "//on a package\n"
      "@AnyMetaDef( name=\"property\" \n"
      "    idType = \"integer\", \n"
      "    metaType = \"string\", \n"
      "    metaValues = {\n"
      "        @MetaValue( value = \"S\", targetEntity = StringProperty.class ),\n"
      "        @MetaValue( value = \"I\", targetEntity = IntegerProperty.class )\n"
      "    } )\n"
      "package org.hibernate.test.annotations.any;\n"
      "\n"
      "\n"
      "//in a class\n"
      "    @Any( metaDef=\"property\", metaColumn = @Column( name = \"property_type\" ), fetch=FetchType.EAGER )\n"
      "    @JoinColumn( name = \"property_id\" )\n"
      "    public Property getMainProperty() {\n"
      "        return mainProperty;\n"
      "    }"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3582
#, no-c-format
msgid "The hbm.xml equivalent is:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3584
#, no-c-format
msgid ""
      "<any name=\"being\" id-type=\"long\" meta-type=\"string\">\n"
      "    <meta-value value=\"TBL_ANIMAL\" class=\"Animal\"/>\n"
      "    <meta-value value=\"TBL_HUMAN\" class=\"Human\"/>\n"
      "    <meta-value value=\"TBL_ALIEN\" class=\"Alien\"/>\n"
      "    <column name=\"table_name\"/>\n"
      "    <column name=\"id\"/>\n"
      "</any>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3587
#, no-c-format
msgid "You cannot mutualize the metadata in hbm.xml as you can in annotations."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3606
#, no-c-format
msgid ""
      "<any\n"
      "        name=\"propertyName\"\n"
      "        id-type=\"idtypename\"\n"
      "        meta-type=\"metatypename\"\n"
      "        cascade=\"cascade_style\"\n"
      "        access=\"field|property|ClassName\"\n"
      "        optimistic-lock=\"true|false\"\n"
      ">\n"
      "        <meta-value ... />\n"
      "        <meta-value ... />\n"
      "        .....\n"
      "        <column .... />\n"
      "        <column .... />\n"
      "        .....\n"
      "</any>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3610
#, no-c-format
msgid "<literal>name: the property name."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3614
#, no-c-format
msgid "<literal>id-type: the identifier type."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3618
#, no-c-format
msgid "<literal>meta-type (optional - defaults to string): any type that is allowed for a discriminator mapping."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3624
#, no-c-format
msgid "<literal>cascade (optional- defaults to none): the cascade style."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3635
#, no-c-format
msgid "<literal>optimistic-lock (optional - defaults to true): specifies that updates to this property either do or do not require acquisition of the optimistic lock. It defines whether a version increment should occur if this property is dirty."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3646
#, no-c-format
msgid "Properties"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3648
#, no-c-format
msgid "The <literal><properties> element allows the definition of a named, logical grouping of the properties of a class. The most important use of the construct is that it allows a combination of properties to be the target of a property-ref. It is also a convenient way to define a multi-column unique constraint. For example:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3668
#, no-c-format
msgid ""
      "<properties\n"
      "        name=\"logicalName\"\n"
      "        insert=\"true|false\"\n"
      "        update=\"true|false\"\n"
      "        optimistic-lock=\"true|false\"\n"
      "        unique=\"true|false\"\n"
      ">\n"
      "\n"
      "        <property ...../>\n"
      "        <many-to-one .... />\n"
      "        ........\n"
      "</properties>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3672
#, no-c-format
msgid "<literal>name: the logical name of the grouping. It is not an actual property name."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3687
#, no-c-format
msgid "<literal>optimistic-lock (optional - defaults to true): specifies that updates to these properties either do or do not require acquisition of the optimistic lock. It determines if a version increment should occur when these properties are dirty."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3702
#, no-c-format
msgid "For example, if we have the following <literal><properties> mapping:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3705
#, no-c-format
msgid ""
      "<class name=\"Person\">\n"
      "    <id name=\"personNumber\"/>\n"
      "\n"
      "    ...\n"
      "    <properties name=\"name\"\n"
      "            unique=\"true\" update=\"false\">\n"
      "        <property name=\"firstName\"/>\n"
      "        <property name=\"initial\"/>\n"
      "        <property name=\"lastName\"/>\n"
      "    </properties>\n"
      "</class>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3707
#, no-c-format
msgid "You might have some legacy data association that refers to this unique key of the <literal>Person table, instead of to the primary key:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3711
#, no-c-format
msgid ""
      "<many-to-one name=\"owner\"\n"
      "         class=\"Person\" property-ref=\"name\">\n"
      "    <column name=\"firstName\"/>\n"
      "    <column name=\"initial\"/>\n"
      "    <column name=\"lastName\"/>\n"
      "</many-to-one>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3714
#, no-c-format
msgid "When using annotations as a mapping strategy, such construct is not necessary as the binding between a column and its related column on the associated table is done directly"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3721
#, no-c-format
msgid "The use of this outside the context of mapping legacy data is not recommended."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3726
#, no-c-format
msgid "Some hbm.xml specificities"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3728
#, no-c-format
msgid "The hbm.xml structure has some specificities naturally not present when using annotations, let's describe them briefly."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3732
#, no-c-format
msgid "Doctype"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3734
#, no-c-format
msgid "All XML mappings should declare the doctype shown. The actual DTD can be found at the URL above, in the directory <literal>hibernate-x.x.x/src/org/hibernate , or in hibernate3.jar. Hibernate will always look for the DTD in its classpath first. If you experience lookups of the DTD using an Internet connection, check the DTD declaration against the contents of your classpath."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3743
#, no-c-format
msgid "EntityResolver"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3745
#, no-c-format
msgid "Hibernate will first attempt to resolve DTDs in its classpath. It does this is by registering a custom <literal>org.xml.sax.EntityResolver implementation with the SAXReader it uses to read in the xml files. This custom EntityResolver recognizes two different systemId namespaces:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3754
#, no-c-format
msgid "a <literal>hibernate namespace is recognized whenever the resolver encounters a systemId starting with http://www.hibernate.org/dtd/. The resolver attempts to resolve these entities via the classloader which loaded the Hibernate classes."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3762
#, no-c-format
msgid "a <literal>user namespace is recognized whenever the resolver encounters a systemId using a classpath:// URL protocol. The resolver will attempt to resolve these entities via (1) the current thread context classloader and (2) the classloader which loaded the Hibernate classes."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3771
#, no-c-format
msgid "The following is an example of utilizing user namespacing:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3774
#, no-c-format
msgid ""
      "<xi:include href=\"../extras/namespacing.xml_sample\" parse=\"text\"\n"
      "              xmlns:xi=\"http://www.w3.org/2001/XInclude\" />"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3776
#, no-c-format
msgid "Where <literal>types.xml is a resource in the your.domain package and contains a custom typedef."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3783
#, no-c-format
msgid "Hibernate-mapping"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3785
#, no-c-format
msgid "This element has several optional attributes. The <literal>schema and catalog attributes specify that tables referred to in this mapping belong to the named schema and/or catalog. If they are specified, tablenames will be qualified by the given schema and catalog names. If they are missing, tablenames will be unqualified. The default-cascade attribute specifies what cascade style should be assumed for properties and collections that do not specify a cascade attribute. By default, the auto-import attribute allows you to use unqualified class names in the query language."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3814
#, no-c-format
msgid ""
      "<hibernate-mapping\n"
      "         schema=\"schemaName\"\n"
      "         catalog=\"catalogName\"\n"
      "         default-cascade=\"cascade_style\"\n"
      "         default-access=\"field|property|ClassName\"\n"
      "         default-lazy=\"true|false\"\n"
      "         auto-import=\"true|false\"\n"
      "         package=\"package.name\"\n"
      " />"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3818
#, no-c-format
msgid "<literal>schema (optional): the name of a database schema."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3823
#, no-c-format
msgid "<literal>catalog (optional): the name of a database catalog."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3828
#, no-c-format
msgid "<literal>default-cascade (optional - defaults to none): a default cascade style."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3833
#, no-c-format
msgid "<literal>default-access (optional - defaults to property): the strategy Hibernate should use for accessing all properties. It can be a custom implementation of PropertyAccessor."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3840
#, no-c-format
msgid "<literal>default-lazy (optional - defaults to true): the default value for unspecified lazy attributes of class and collection mappings."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3847
#, no-c-format
msgid "<literal>auto-import (optional - defaults to true): specifies whether we can use unqualified class names of classes in this mapping in the query language."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3854
#, no-c-format
msgid "<literal>package (optional): specifies a package prefix to use for unqualified class names in the mapping document."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3861
#, no-c-format
msgid "If you have two persistent classes with the same unqualified name, you should set <literal>auto-import=\"false\". An exception will result if you attempt to assign two classes to the same \"imported\" name."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3866
#, no-c-format
msgid "The <literal>hibernate-mapping element allows you to nest several persistent <class> mappings, as shown above. It is, however, good practice (and expected by some tools) to map only a single persistent class, or a single class hierarchy, in one mapping file and name it after the persistent superclass. For example, Cat.hbm.xml, Dog.hbm.xml, or if using inheritance, Animal.hbm.xml."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3877
#, no-c-format
msgid "<title>Key"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3879
#, no-c-format
msgid "The <literal><key> element is featured a few times within this guide. It appears anywhere the parent mapping element defines a join to a new table that references the primary key of the original table. It also defines the foreign key in the joined table:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3900
#, no-c-format
msgid ""
      "<key\n"
      "        column=\"columnname\"\n"
      "        on-delete=\"noaction|cascade\"\n"
      "        property-ref=\"propertyName\"\n"
      "        not-null=\"true|false\"\n"
      "        update=\"true|false\"\n"
      "        unique=\"true|false\"\n"
      "/>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3910
#, no-c-format
msgid "<literal>on-delete (optional - defaults to noaction): specifies whether the foreign key constraint has database-level cascade delete enabled."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3916
#, no-c-format
msgid "<literal>property-ref (optional): specifies that the foreign key refers to columns that are not the primary key of the original table. It is provided for legacy data."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3922
#, no-c-format
msgid "<literal>not-null (optional): specifies that the foreign key columns are not nullable. This is implied whenever the foreign key is also part of the primary key."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3928
#, no-c-format
msgid "<literal>update (optional): specifies that the foreign key should never be updated. This is implied whenever the foreign key is also part of the primary key."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3934
#, no-c-format
msgid "<literal>unique (optional): specifies that the foreign key should have a unique constraint. This is implied whenever the foreign key is also the primary key."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3941
#, no-c-format
msgid "For systems where delete performance is important, we recommend that all keys should be defined <literal>on-delete=\"cascade\". Hibernate uses a database-level ON CASCADE DELETE constraint, instead of many individual DELETE statements. Be aware that this feature bypasses Hibernate's usual optimistic locking strategy for versioned data."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3949
#, no-c-format
msgid "The <literal>not-null and update attributes are useful when mapping a unidirectional one-to-many association. If you map a unidirectional one-to-many association to a non-nullable foreign key, you must declare the key column using <key not-null=\"true\">."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3958
#, no-c-format
msgid "Import"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3960
#, no-c-format
msgid "If your application has two persistent classes with the same name, and you do not want to specify the fully qualified package name in Hibernate queries, classes can be \"imported\" explicitly, rather than relying upon <literal>auto-import=\"true\". You can also import classes and interfaces that are not explicitly mapped:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3966
#, no-c-format
msgid "<import class=\"java.lang.Object\" rename=\"Universe\"/>"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:3975
#, no-c-format
msgid ""
      "<import\n"
      "        class=\"ClassName\"\n"
      "        rename=\"ShortName\"\n"
      "/>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:3979
#, no-c-format
msgid "<literal>class: the fully qualified class name of any Java class."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3984
#, no-c-format
msgid "<literal>rename (optional - defaults to the unqualified class name): a name that can be used in the query language."
msgstr ""

#. Tag: para
#: basic_mapping.xml:3992
#, no-c-format
msgid "This feature is unique to hbm.xml and is not supported in annotations."
msgstr ""

#. Tag: title
#: basic_mapping.xml:3998
#, no-c-format
msgid "Column and formula elements"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4000
#, no-c-format
msgid "Mapping elements which accept a <literal>column attribute will alternatively accept a <column> subelement. Likewise, <formula> is an alternative to the formula attribute. For example:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:4006
#, no-c-format
msgid ""
      "<column\n"
      "        name=\"column_name\"\n"
      "        length=\"N\"\n"
      "        precision=\"N\"\n"
      "        scale=\"N\"\n"
      "        not-null=\"true|false\"\n"
      "        unique=\"true|false\"\n"
      "        unique-key=\"multicolumn_unique_key_name\"\n"
      "        index=\"index_name\"\n"
      "        sql-type=\"sql_type_name\"\n"
      "        check=\"SQL expression\"\n"
      "        default=\"SQL expression\"\n"
      "        read=\"SQL expression\"\n"
      "        write=\"SQL expression\"/>"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:4008
#, no-c-format
msgid "<formula>SQL expression</formula>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4010
#, no-c-format
msgid "Most of the attributes on <literal>column provide a means of tailoring the DDL during automatic schema generation. The read and write attributes allow you to specify custom SQL that Hibernate will use to access the column's value. For more on this, see the discussion of column read and write expressions."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4018
#, no-c-format
msgid "The <literal>column and formula elements can even be combined within the same property or association mapping to express, for example, exotic join conditions."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:4022
#, no-c-format
msgid ""
      "<many-to-one name=\"homeAddress\" class=\"Address\"\n"
      "        insert=\"false\" update=\"false\">\n"
      "    <column name=\"person_id\" not-null=\"true\" length=\"10\"/>\n"
      "    <formula>'MAILING'</formula>\n"
      "</many-to-one>"
msgstr ""

#. Tag: title
#: basic_mapping.xml:4028
#, no-c-format
msgid "Hibernate types"
msgstr ""

#. Tag: title
#: basic_mapping.xml:4031
#, no-c-format
msgid "Entities and values"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4033
#, no-c-format
msgid "In relation to the persistence service, Java language-level objects are classified into two groups:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4036
#, no-c-format
msgid "An <emphasis>entity exists independently of any other objects holding references to the entity. Contrast this with the usual Java model, where an unreferenced object is garbage collected. Entities must be explicitly saved and deleted. Saves and deletions, however, can be cascaded from a parent entity to its children. This is different from the ODMG model of object persistence by reachability and corresponds more closely to how application objects are usually used in large systems. Entities support circular and shared references. They can also be versioned."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4046
#, no-c-format
msgid "An entity's persistent state consists of references to other entities and instances of <emphasis>value types. Values are primitives: collections (not what is inside a collection), components and certain immutable objects. Unlike entities, values in particular collections and components, are persisted and deleted by reachability. Since value objects and primitives are persisted and deleted along with their containing entity, they cannot be independently versioned. Values have no independent identity, so they cannot be shared by two entities or collections."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4056
#, no-c-format
msgid "Until now, we have been using the term \"persistent class\" to refer to entities. We will continue to do that. Not all user-defined classes with a persistent state, however, are entities. A <emphasis>component is a user-defined class with value semantics. A Java property of type java.lang.String also has value semantics. Given this definition, all types (classes) provided by the JDK have value type semantics in Java, while user-defined types can be mapped with entity or value type semantics. This decision is up to the application developer. An entity class in a domain model will normally have shared references to a single instance of that class, while composition or aggregation usually translates to a value type."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4069
#, no-c-format
msgid "We will revisit both concepts throughout this reference guide."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4072
#, no-c-format
msgid "The challenge is to map the Java type system, and the developers' definition of entities and value types, to the SQL/database type system. The bridge between both systems is provided by Hibernate. For entities, <literal><class>, <subclass> and so on are used. For value types we use <property>, <component>etc., that usually have a type attribute. The value of this attribute is the name of a Hibernate mapping type. Hibernate provides a range of mappings for standard JDK value types out of the box. You can write your own mapping types and implement your own custom conversion strategies."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4085
#, no-c-format
msgid "With the exception of collections, all built-in Hibernate types support null semantics."
msgstr ""

#. Tag: title
#: basic_mapping.xml:4090
#, no-c-format
msgid "Basic value types"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4092
#, no-c-format
msgid "The built-in <emphasis>basic mapping types can be roughly categorized into the following:"
msgstr ""

#. Tag: literal
#: basic_mapping.xml:4095
#, no-c-format
msgid "integer, long, short, float, double, character, byte, boolean, yes_no, true_false"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4099
#, no-c-format
msgid "Type mappings from Java primitives or wrapper classes to appropriate (vendor-specific) SQL column types. <literal>boolean, yes_no and true_false are all alternative encodings for a Java boolean or java.lang.Boolean."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:4109
#, no-c-format
msgid "string"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4112
#, no-c-format
msgid "A type mapping from <literal>java.lang.String to VARCHAR (or Oracle VARCHAR2)."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:4119
#, no-c-format
msgid "date, time, timestamp"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4122
#, no-c-format
msgid "Type mappings from <literal>java.util.Date and its subclasses to SQL types DATE, TIME and TIMESTAMP (or equivalent)."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:4130
#, no-c-format
msgid "calendar, calendar_date"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4133
#, no-c-format
msgid "Type mappings from <literal>java.util.Calendar to SQL types TIMESTAMP and DATE (or equivalent)."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:4140
#, no-c-format
msgid "big_decimal, big_integer"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4143
#, no-c-format
msgid "Type mappings from <literal>java.math.BigDecimal and java.math.BigInteger to NUMERIC (or Oracle NUMBER)."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:4151
#, no-c-format
msgid "locale, timezone, currency"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4154
#, no-c-format
msgid "Type mappings from <literal>java.util.Locale, java.util.TimeZone and java.util.Currency to VARCHAR (or Oracle VARCHAR2). Instances of Locale and Currency are mapped to their ISO codes. Instances of TimeZone are mapped to their ID."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:4167
#, no-c-format
msgid "class"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4170
#, no-c-format
msgid "A type mapping from <literal>java.lang.Class to VARCHAR (or Oracle VARCHAR2). A Class is mapped to its fully qualified name."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:4178
#, no-c-format
msgid "binary"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4181
#, no-c-format
msgid "Maps byte arrays to an appropriate SQL binary type."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:4186
#, no-c-format
msgid "text"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4189
#, no-c-format
msgid "Maps long Java strings to a SQL <literal>LONGVARCHAR or TEXT type."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:4195
#, no-c-format
msgid "image"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4198
#, no-c-format
msgid "Maps long byte arrays to a SQL <literal>LONGVARBINARY."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:4203
#, no-c-format
msgid "serializable"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4206
#, no-c-format
msgid "Maps serializable Java types to an appropriate SQL binary type. You can also indicate the Hibernate type <literal>serializable with the name of a serializable Java class or interface that does not default to a basic type."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:4215
#, no-c-format
msgid "clob, blob"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4218
#, no-c-format
msgid "Type mappings for the JDBC classes <literal>java.sql.Clob and java.sql.Blob. These types can be inconvenient for some applications, since the blob or clob object cannot be reused outside of a transaction. Driver support is patchy and inconsistent."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:4228
#, no-c-format
msgid "materialized_clob"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4231
#, no-c-format
msgid "Maps long Java strings to a SQL <literal>CLOB type. When read, the CLOB value is immediately materialized into a Java string. Some drivers require the CLOB value to be read within a transaction. Once materialized, the Java string is available outside of the transaction."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:4241
#, no-c-format
msgid "materialized_blob"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4244
#, no-c-format
msgid "Maps long Java byte arrays to a SQL <literal>BLOB type. When read, the BLOB value is immediately materialized into a byte array. Some drivers require the BLOB value to be read within a transaction. Once materialized, the byte array is available outside of the transaction."
msgstr ""

#. Tag: literal
#: basic_mapping.xml:4254
#, no-c-format
msgid "imm_date, imm_time, imm_timestamp, imm_calendar, imm_calendar_date, imm_serializable, imm_binary"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4258
#, no-c-format
msgid "Type mappings for what are considered mutable Java types. This is where Hibernate makes certain optimizations appropriate only for immutable Java types, and the application treats the object as immutable. For example, you should not call <literal>Date.setTime() for an instance mapped as imm_timestamp. To change the value of the property, and have that change made persistent, the application must assign a new, nonidentical, object to the property."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4270
#, no-c-format
msgid "Unique identifiers of entities and collections can be of any basic type except <literal>binary, blob and clob. Composite identifiers are also allowed. See below for more information."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4275
#, no-c-format
msgid "The basic value types have corresponding <literal>Type constants defined on org.hibernate.Hibernate. For example, Hibernate.STRING represents the string type."
msgstr ""

#. Tag: title
#: basic_mapping.xml:4282
#, no-c-format
msgid "Custom value types"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4284
#, no-c-format
msgid "It is relatively easy for developers to create their own value types. For example, you might want to persist properties of type <literal>java.lang.BigInteger to VARCHAR columns. Hibernate does not provide a built-in type for this. Custom types are not limited to mapping a property, or collection element, to a single table column. So, for example, you might have a Java property getName()/setName() of type java.lang.String that is persisted to the columns FIRST_NAME, INITIAL, SURNAME."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4295
#, no-c-format
msgid "To implement a custom type, implement either <literal>org.hibernate.UserType or org.hibernate.CompositeUserType and declare properties using the fully qualified classname of the type. View org.hibernate.test.DoubleStringType to see the kind of things that are possible."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:4302
#, no-c-format
msgid ""
      "<property name=\"twoStrings\" type=\"org.hibernate.test.DoubleStringType\">\n"
      "    <column name=\"first_string\"/>\n"
      "    <column name=\"second_string\"/>\n"
      "</property>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4304
#, no-c-format
msgid "Notice the use of <literal><column> tags to map a property to multiple columns."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4307
#, no-c-format
msgid "The <literal>CompositeUserType, EnhancedUserType, UserCollectionType, and UserVersionType interfaces provide support for more specialized uses."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4313
#, no-c-format
msgid "You can even supply parameters to a <literal>UserType in the mapping file. To do this, your UserType must implement the org.hibernate.usertype.ParameterizedType interface. To supply parameters to your custom type, you can use the <type> element in your mapping files."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:4320
#, no-c-format
msgid ""
      "<property name=\"priority\">\n"
      "    <type name=\"com.mycompany.usertypes.DefaultValueIntegerType\">\n"
      "        <param name=\"default\">0</param>\n"
      "    </type>\n"
      "</property>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4322
#, no-c-format
msgid "The <literal>UserType can now retrieve the value for the parameter named default from the Properties object passed to it."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4326
#, no-c-format
msgid "If you regularly use a certain <literal>UserType, it is useful to define a shorter name for it. You can do this using the <typedef> element. Typedefs assign a name to a custom type, and can also contain a list of default parameter values if the type is parameterized."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:4332
#, no-c-format
msgid ""
      "<typedef class=\"com.mycompany.usertypes.DefaultValueIntegerType\" name=\"default_zero\">\n"
      "    <param name=\"default\">0</param>\n"
      "</typedef>"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:4334
#, no-c-format
msgid "<property name=\"priority\" type=\"default_zero\"/>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4336
#, no-c-format
msgid "It is also possible to override the parameters supplied in a typedef on a case-by-case basis by using type parameters on the property mapping."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4340
#, no-c-format
msgid "Even though Hibernate's rich range of built-in types and support for components means you will rarely need to use a custom type, it is considered good practice to use custom types for non-entity classes that occur frequently in your application. For example, a <literal>MonetaryAmount class is a good candidate for a CompositeUserType, even though it could be mapped as a component. One reason for this is abstraction. With a custom type, your mapping documents would be protected against changes to the way monetary values are represented."
msgstr ""

#. Tag: title
#: basic_mapping.xml:4353
#, no-c-format
msgid "Mapping a class more than once"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4355
#, no-c-format
msgid "It is possible to provide more than one mapping for a particular persistent class. In this case, you must specify an <emphasis>entity name to disambiguate between instances of the two mapped entities. By default, the entity name is the same as the class name. Hibernate lets you specify the entity name when working with persistent objects, when writing queries, or when mapping associations to the named entity."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:4363
#, no-c-format
msgid ""
      "<class name=\"Contract\" table=\"Contracts\"\n"
      "        entity-name=\"CurrentContract\">\n"
      "    ...\n"
      "    <set name=\"history\" inverse=\"true\"\n"
      "            order-by=\"effectiveEndDate desc\">\n"
      "        <key column=\"currentContractId\"/>\n"
      "        <one-to-many entity-name=\"HistoricalContract\"/>\n"
      "    </set>\n"
      "</class>\n"
      "\n"
      "<class name=\"Contract\" table=\"ContractHistory\"\n"
      "        entity-name=\"HistoricalContract\">\n"
      "    ...\n"
      "    <many-to-one name=\"currentContract\"\n"
      "            column=\"currentContractId\"\n"
      "            entity-name=\"CurrentContract\"/>\n"
      "</class>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4365
#, no-c-format
msgid "Associations are now specified using <literal>entity-name instead of class."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4369 basic_mapping.xml:4497
#, no-c-format
msgid "This feature is not supported in Annotations"
msgstr ""

#. Tag: title
#: basic_mapping.xml:4374
#, no-c-format
msgid "SQL quoted identifiers"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4376
#, no-c-format
msgid "You can force Hibernate to quote an identifier in the generated SQL by enclosing the table or column name in backticks in the mapping document. Hibernate will use the correct quotation style for the SQL <literal>Dialect. This is usually double quotes, but the SQL Server uses brackets and MySQL uses backticks."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:4382
#, no-c-format
msgid ""
      "@Entity @Table(name=\"`Line Item`\")\n"
      "class LineItem {\n"
      "   @id @Column(name=\"`Item Id`\") Integer id;\n"
      "   @Column(name=\"`Item #`\") int itemNumber\n"
      "}\n"
      "\n"
      "<class name=\"LineItem\" table=\"`Line Item`\">\n"
      "    <id name=\"id\" column=\"`Item Id`\"/><generator class=\"assigned\"/></id>\n"
      "    <property name=\"itemNumber\" column=\"`Item #`\"/>\n"
      "    ...\n"
      "</class>"
msgstr ""

#. Tag: title
#: basic_mapping.xml:4386
#, no-c-format
msgid "Generated properties"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4388
#, no-c-format
msgid "Generated properties are properties that have their values generated by the database. Typically, Hibernate applications needed to <literal>refresh objects that contain any properties for which the database was generating values. Marking properties as generated, however, lets the application delegate this responsibility to Hibernate. When Hibernate issues an SQL INSERT or UPDATE for an entity that has defined generated properties, it immediately issues a select afterwards to retrieve the generated values."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4397
#, no-c-format
msgid "Properties marked as generated must additionally be non-insertable and non-updateable. Only <link linkend=\"mapping-declaration-version\">versions, timestamps, and simple properties, can be marked as generated."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4404
#, no-c-format
msgid "<literal>never (the default): the given property value is not generated within the database."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4407
#, no-c-format
msgid "<literal>insert: the given property value is generated on insert, but is not regenerated on subsequent updates. Properties like created-date fall into this category. Even though version and timestamp properties can be marked as generated, this option is not available."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4414
#, no-c-format
msgid "<literal>always: the property value is generated both on insert and on update."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4417
#, no-c-format
msgid "To mark a property as generated, use <classname>@Generated."
msgstr ""

#. Tag: title
#: basic_mapping.xml:4422
#, no-c-format
msgid "Column transformers: read and write expressions"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4424
#, no-c-format
msgid "Hibernate allows you to customize the SQL it uses to read and write the values of columns mapped to <link linkend=\"mapping-declaration-property\">simple properties. For example, if your database provides a set of data encryption functions, you can invoke them for individual columns like this:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:4430
#, no-c-format
msgid ""
      "@Entity\n"
      "class CreditCard {\n"
      "   @Column(name=\"credit_card_num\")\n"
      "   @ColumnTransformer(\n"
      "      read=\"decrypt(credit_card_num)\", \n"
      "      write=\"encrypt(?)\")\n"
      "   public String getCreditCardNumber() { return creditCardNumber; }\n"
      "   public void setCreditCardNumber(String number) { this.creditCardNumber = number; }\n"
      "   private String creditCardNumber;\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4432
#, no-c-format
msgid "or in XML"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:4434
#, no-c-format
msgid ""
      "<property name=\"creditCardNumber\">\n"
      "        <column \n"
      "          name=\"credit_card_num\"\n"
      "          read=\"decrypt(credit_card_num)\"\n"
      "          write=\"encrypt(?)\"/>\n"
      "</property>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4437
#, no-c-format
msgid "You can use the plural form <classname>@ColumnTransformers if more than one columns need to define either of these rules."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4442
#, no-c-format
msgid "If a property uses more that one column, you must use the <literal>forColumn attribute to specify which column, the expressions are targeting."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:4446
#, no-c-format
msgid ""
      "@Entity\n"
      "class User {\n"
      "   @Type(type=\"com.acme.type.CreditCardType\")\n"
      "   @Columns( {\n"
      "      @Column(name=\"credit_card_num\"),\n"
      "      @Column(name=\"exp_date\") } )\n"
      "   @ColumnTransformer(\n"
      "      forColumn=\"credit_card_num\", \n"
      "      read=\"decrypt(credit_card_num)\", \n"
      "      write=\"encrypt(?)\")\n"
      "   public CreditCard getCreditCard() { return creditCard; }\n"
      "   public void setCreditCard(CreditCard card) { this.creditCard = card; }\n"
      "   private CreditCard creditCard;\n"
      "}"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4448
#, no-c-format
msgid "Hibernate applies the custom expressions automatically whenever the property is referenced in a query. This functionality is similar to a derived-property <literal>formula with two differences:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4453
#, no-c-format
msgid "The property is backed by one or more columns that are exported as part of automatic schema generation."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4458
#, no-c-format
msgid "The property is read-write, not read-only."
msgstr ""

#. Tag: para
#: basic_mapping.xml:4462
#, no-c-format
msgid "The <literal>write expression, if specified, must contain exactly one '?' placeholder for the value."
msgstr ""

#. Tag: title
#: basic_mapping.xml:4467
#, no-c-format
msgid "Auxiliary database objects"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4469
#, no-c-format
msgid "Auxiliary database objects allow for the CREATE and DROP of arbitrary database objects. In conjunction with Hibernate's schema evolution tools, they have the ability to fully define a user schema within the Hibernate mapping files. Although designed specifically for creating and dropping things like triggers or stored procedures, any SQL command that can be run via a <literal>java.sql.Statement.execute() method is valid (for example, ALTERs, INSERTS, etc.). There are essentially two modes for defining auxiliary database objects:"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4479
#, no-c-format
msgid "The first mode is to explicitly list the CREATE and DROP commands in the mapping file:"
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:4482
#, no-c-format
msgid ""
      "<hibernate-mapping>\n"
      "    ...\n"
      "    <database-object>\n"
      "        <create>CREATE TRIGGER my_trigger ...</create>\n"
      "        <drop>DROP TRIGGER my_trigger</drop>\n"
      "    </database-object>\n"
      "</hibernate-mapping>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4484
#, no-c-format
msgid "The second mode is to supply a custom class that constructs the CREATE and DROP commands. This custom class must implement the <literal>org.hibernate.mapping.AuxiliaryDatabaseObject interface."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:4489
#, no-c-format
msgid ""
      "<hibernate-mapping>\n"
      "    ...\n"
      "    <database-object>\n"
      "        <definition class=\"MyTriggerDefinition\"/>\n"
      "    </database-object>\n"
      "</hibernate-mapping>"
msgstr ""

#. Tag: para
#: basic_mapping.xml:4491
#, no-c-format
msgid "Additionally, these database objects can be optionally scoped so that they only apply when certain dialects are used."
msgstr ""

#. Tag: programlisting
#: basic_mapping.xml:4494
#, no-c-format
msgid ""
      "<hibernate-mapping>\n"
      "    ...\n"
      "    <database-object>\n"
      "        <definition class=\"MyTriggerDefinition\"/>\n"
      "        <dialect-scope name=\"org.hibernate.dialect.Oracle9iDialect\"/>\n"
      "        <dialect-scope name=\"org.hibernate.dialect.Oracle10gDialect\"/>\n"
      "    </database-object>\n"
      "</hibernate-mapping>"
msgstr ""

Other Hibernate examples (source code examples)

Here is a short list of links related to this Hibernate basic_mapping.pot source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.