Home
Hibernate Reference Documentation
Contents
1. 207 Kapitel 14 Batch Verarbeitung session close 208 a ve a HQL Die Hibernate Query W Language Hibernate uses a powerful query language HQL that is similar in appearance to SQL Compared with SQL however HQL is fully object oriented and understands notions like inheritance polymorphism and association 15 1 Beachtung der Gro und Kleinschreibung With the exception of names of Java classes and properties queries are case insensitive So SeLeCT is the same aS sELEct is the same as SELECT but org hibernate eg FOO is not org hibernate eg Foo and foo barSet IS NOt foo BARSET This manual uses lowercase HQL keywords Some users find queries with uppercase keywords more readable but this convention is unsuitable for queries embedded in Java code 15 2 Die from Klausel Die einfachste Form der Hibernate Anfrage lautet from eg Cat This returns all instances of the class eg cat You do not usually need to qualify the class name since auto import is the default For example from Cat In order to refer to the cat in other parts of the query you will need to assign an alias For example from Cat as cat This query assigns the alias cat to Cat instances so you can use that alias later in the query The as keyword is optional You could also write from Cat cat Multiple classes can appear resulting in a cartesian product or cross join 209 Kapi
2. do some work sess getTransaction commit catch RuntimeException e sess getTransaction rollback throw e or display error message 189 Kapitel 12 Transactions and finally sess close setTimeout cannot be called in a CMT bean where transaction timeouts must be defined declaratively 12 3 Optimistische Nebenl ufigkeitskontrolle The only approach that is consistent with high concurrency and high scalability is optimistic concurrency control with versioning Version checking uses version numbers or timestamps to detect conflicting updates and to prevent lost updates Hibernate provides three possible approaches to writing application code that uses optimistic concurrency The use cases we discuss are in the context of long conversations but version checking also has the benefit of preventing lost updates in single database transactions 12 3 1 Kontrolle der Anwendungsversion In an implementation without much help from Hibernate each interaction with the database occurs in a new Session and the developer is responsible for reloading all persistent instances from the database before manipulating them The application is forced to carry out its own version checking to ensure conversation transaction isolation This approach is the least efficient in terms of database access It is the approach most similar to entity EJBs foo is an instance loaded by a previous Session
3. susss4sssnnnnnennnnnnnnnnnnnnnnnnnnnnnannnnnnnenannnnnnnnn 44 3 4 3 Binare Datenstr me nn nennen nn anne 44 3 4 4 Zweite Ebene und Anfragen Cache 424244444nnnnnnnnnnnnnnnennnnnnnnn nn 44 3 4 5 Query Language Substitution ussssssssnnnenennnnnnnnnnnnnn nen nnnnnnnnnnnnenn 44 3 4 6 Die Hibernate Statistik 00244nsenennnnnnnnnnnannnnnnnnnnnnnnnnnnnnnnnnnnnnnn 45 3 5 ProtoK llier ng ee es 45 3 6 Implementing a NamingStrategy c ecceeeeeeeeeeeeeeeeeeeeeeeaaeaeeeeeeeeeeaeaaeeeneeeees 46 2 7 XML Ko nfigurationsdatei u se nee ea 46 3 8 Integration des J2EE Applikationsservers un222ennnnsnnnnnnnnnnennnnnnnennnnnnn en nnnnnnen 48 3 8 1 Konfiguration der Transaktionsstrategie 44444444nnennnnnnnnnnnnnnennnnn 48 HIBERNATE Relational Persis 3 8 2 JNDI bound SessionFactory 222224402esnsnnnnnsnnnnnenennnnnnnnnnnnnnn en nnnnnnnnnnn 49 3 8 3 Aktuelles Management des Sessionkontexts mit UTA c cececeseeeeeeeeeees 50 3 8 4 JMX Deployment 4 0444H4snnnnnnennnnnnnen nn E nenn 50 4 Persistente Klassen 2 een aia aaa i AE a EEE 53 4 1 Ein einfaches POJO Beispiel uunnnnsnsnnnnnennnnnnnnnnnnnnnennnnnnnnnnnnnen nn 53 4 1 1 Implementierung eines No Argument Konstruktors 54 4 1 2 Bereitstellung einer Bezeichner Property optional n4 nn 5
4. 285 Kapitel 21 Toolset Handbuch Property Name hibernate connection url hibernate connection username Beschreibung jdbe url Datenbankbenutzer hibernate connection password hibernate dialect Benutzer Passwort Dialekt 21 1 4 Die Verwendung von Ant Sie k nnen SchemaExport vom Ihrem Ant Build Skript aufrufen lt target name schemaexport gt lt taskdef name schemaexport classname org hibernate tool hbm2ddl SchemaExportTask classpathref class path gt lt schemaexport properties hibernate properties quiet no text no drop no delimiter output schema export sqi gt lt fileset dir src gt lt include name hbm xml gt lt fileset gt lt schemaexport gt lt target 21 1 5 Inkrementelle Schema Aktualisierungen The SchemaUpdate tool will update an existing schema with incremental changes The SchemaUpdate depends upon the JDBC metadata API and as such will not work with all JDBC drivers java cp hibernate_classpaths org hibernate tool hbm2dd1 SchemaUpdate options mapping_files Tabelle 21 4 schemaupdate Befehlszeilenoptionen Option quiet text naming eg MyNamingStrategy properties hibernate properties Beschreibung l do not output the script to stdout do not export the script to the database w hlen Sie eine NamingStrategy Datenbank Properties aus einer Datei lesen 286
5. 241 Kapitel 17 Native SQL Query query sess createSQLQuery SELECT FROM CATS WHERE NAME like addEntity Cat class List pusList query setString 0 Pus list query sess createSQLQuery SELECT FROM CATS WHERE NAME like name addEntity Cat class List pusList query setString name Pus list 17 2 Benannte SQL Anfragen Named SQL queries can be defined in the mapping document and called in exactly the same way as a named HQL query In this case you do not need to call addEntity lt sql query name persons gt lt return alias person class eg Person gt SELECT person NAME AS person name person AGE AS person age person SEX AS person sex FROM PERSON person WHERE person NAME LIKE namePattern lt sql query gt List people sess getNamedQuery persons setString namePattern namePattern setMaxResults 50 alise g The lt return join gt element is use to join associations and the lt load collection gt element is used to define queries which initialize collections lt sql query name personsWith gt lt return alias person class eg Person gt lt return join alias address property person mailingAddress gt SELECT person NAME AS person name person AGE AS person age person SEX AS person sex address STREET AS address street address CITY AS address city address STATE AS address state address ZIP AS address zip FROM PERSON p
6. 244242440nnsnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnannnnnnnen 18 1 2 5 Bidirektionale Assoziationen uususssssssennennnnnnnnsnnnnnen nn nnnnnnnnnnennnen 19 1 2 6 Die Bearbeitung bidirektionaler Verbindungen cceeeeeeeeeeeeeeeeeeeees 20 1 3 Teil 3 Die EventManager Webanwendung uunnssesnnnnnenennnnnnnnnnnnnnnnnnnnnnn 21 1 3 1 Das Schreiben des Grundservlets us04nnnsssnnnenennnnnnnnnnnnen nenn 21 1 3 2 Bearbeitung und Rendering essri 22 1 3 3 Deployment und Test cece eect en nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn 25 1 4 Zusammentassung seort ee ee IE eHEran a Here 25 2 Architekt r 5 44 42er ee 27 2 1 bersicht ec tcc ct en tng ep cate EEE EEE EINEN ENERREINIERLUEENERERREENSSETET 27 2 2 Inst nzst tus au ee en sdodeecteigedaedsleteeesnen ds 30 2 3 JM amp Integration ee 2 unss een sieh 30 2 4 SCA SUPDOM en a eier enger euren ae here 31 2 5 Gontextial sessions ne nennen 31 3 Konfiguration m aan ana a ka ie 33 3 1 Programmatische Konfiguration ssennnnsnnnnnenennnnnnnnnnnnnn nn nnnnnnnnnnnnenn 33 3 2 Erstellung einer SessionFactory uussssssssssnnenennnnnnnnnnnnnnnnnnnnnnnnnnnnnnnennnnnnnnnnnnnn 34 3 3 JDBC Verbindungen ee seer 34 3 4 Optionale Properties der Konfiguration 444444444nenennnnnnnnnnnenen en nnnnnnnnnnnn 36 23 4 1 SQL Di lekte u Re 43 3 4 2 Outer Join Fetching
7. The following table shows which providers are compatible with which concurrency strategies Tabelle 20 2 Cache Nebenlaufigkeitsstrategie Support Cache read only nonstrict read read write transactional write Hash Tabelle yes yes yes nicht f r den Produktionsgebrauch vorgesehen EHCache yes yes yes OSCache yes yes yes SwarmCache yes yes JBoss Cache 1 x yes yes JBoss Cache2 yes yes 20 3 Management der Caches Whenever you pass an object to save update Of saveOrUpdate and whenever you retrieve an object using load get list iterate Or scroll that object is added to the internal cache of the session When flush is subsequently called the state of that object will be synchronized with the database If you do not want this synchronization to occur or if you are processing a huge number of objects and need to manage memory efficiently the evict method can be used to remove the object and its collections from the first level cache ScrollableResult cats sess createQuery from Cat as cat scroll a huge result set while cats next Cat cat Cat cats get 0 273 Kapitel 20 Verbesserung der doSomethingWithACat cat sess evict cat Die Session bietet au erdem eine contains Methode um zu bestimmen ob eine Instanz zu dem Session Cache geh rt To evict all objects from the session cache call session clear F r das
8. The third approach an identifier component is recommended for almost all applications 5 1 8 Discriminator The lt discriminator gt element is required for polymorphic persistence using the table per class hierarchy mapping strategy It declares a discriminator column of the table The discrimi column contains marker values that tell the persistence layer what subclass to instantiate nator for a particular row A restricted set oftypes can be used string character integer byte short boolean yes_no true_false lt discriminator column discriminator_column type diseriminator_type force true false insert true false o formula arbitrary sql expression gt column optional defaults to class the name of the discriminator column type optional defaults to string a name that indicates the Hibernate type force optional defaults to false forces Hibernate to specify the allowed discriminator values even when retrieving all instances of the root class 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 formula optional an arbitrary SQL expression that is executed when a type has to be evaluated It allows content based discrimination Die tatsachlichen Werte der Diskriminatorspalte werden durch das discriminator value At
9. gt person_id_sequence lt param gt lt generator gt lt id gt lt id name id type long column person_id unsaved value 0 gt lt generator class identity gt lt id For cross platform development the native strategy will depending on the capabilities of the underlying database choose from the identity sequence and hilo Strategies 5 1 4 5 Zugeordnete Bezeichner If you want the application to assign identifiers as opposed to having Hibernate generate them you can use the 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 a lt generator gt element The 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 5 1 4 6 Durch Trigger zugeordnete Primarschlussel Hibernate does not generate DDL with triggers It is for legacy schemas only lt id name id type long column person_id gt lt generator class select gt lt param name key gt socialSecurityNumber lt param gt lt generator gt ene gt In the above example there is a unique valued property named socialSecurityNumber It is
10. FO Building First Hibernate Tutorial FO task segment compile FO FO resources resources FO Using default encoding to copy filtered resources 7s a e E A FO compiler compile Kapitel 1 Tutorial FO Compiling 1 source file to home steve projects sandbox hibernateTutorial target classes FO BUILD SUCCESSFUL FO Total time 2 seconds FO Finished at Tue Jun 09 12 25 25 CDT 2009 NFO Final Memory 5M 547M FO R 1 1 6 Inbetriebnahme und Helfer It is time to load and store some Event objects but first you have to complete the setup with some infrastructure code You have to startup Hibernate by building a global org hibernate SessionFactory Object and storing it somewhere for easy access in application code A org hibernate SessionFactory is used to obtain org hibernate Session instances A org hibernate Session represents a single threaded unit of work The org hibernate SessionFactory Is a thread safe global object that is instantiated once We will create a HibernateUtil helper class that takes care of startup and makes accessing the org hibernate SessionFactory more convenient package org hibernate tutorial util import org hibernate SessionFactory import org hibernate cfg Configuration public class HibernateUtil private static final SessionFactory sessionFactory buildSessionFactory j private static SessionFactory buildSessionFacto
11. lt class name Parent gt lt id name id column parent_id gt lt set name children inverse true gt lt key column parent_id gt lt one to many elass Child gt lt set gt lt class gt lt class name Child gt lt id name id column child_id gt lt many to one name parent class Parent column parent_id not null true gt lt class gt Mapping one end of an association with inverse true does not affect the operation of cascades as these are orthogonal concepts 117 Kapitel 6 Collection mapping 6 3 3 Bidirektionale Assoziationen mit indizierten Collections A bidirectional association where one end is represented as a lt list gt Or lt map gt requires special consideration If there is a property of the child class that maps to the index column you can use inverse true on the collection mapping lt class name Parent gt lt id name id column parent_id gt lt map name children inverse true gt lt key column parent_id gt lt map key column name type string gt lt one to many class Child gt lt map gt lt class gt lt class name Child gt lt id name id column child_id gt lt property name name not null true gt lt many to one name parent class Parent column parent_id not null true gt lt class gt If there is no such property on the child class the association cannot be considered t
12. 000000090009 entity name EntityName node element name attribute name element attribute embed xml true false foreign key foreign_key_name name the name of the property class optional defaults to the property type determined by reflection the name of the associated class cascade optional specifies which operations should be cascaded from the parent object to the associated object 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 fetch optional defaults to select chooses between outer join fetching or sequential select fetching 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 access optional defaults to property the strategy Hibernate uses for accessing the property value 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 lazy optional defaults to proxy by default single point
13. Alternativ k nnen Sie den Status in eine beliebige Instanz laden Cat cat new DomesticCat load pk s state into cat sess load cat new Long pkId Set kittens cat getKittens Be aware that 1oad will throw an unrecoverable exception if there is no matching database row If the class is mapped with a proxy load just returns an uninitialized proxy and does not actually hit the database until you invoke a method of the proxy This is useful if you wish to create an association to an object without actually loading it from the database It also allows multiple instances to be loaded as a batch if bat ch size is defined for the class mapping If you are not certain that a matching row exists you should use the get method which hits the database immediately and returns null if there is no matching row Cat cat Cat sess get Cat class id if cat null cat new Cat sess save cat id return cat You can even load an object using an SQL SELECT FOR UPDATE using a LockMode See the API documentation for more information Cat cat Cat sess get Cat class id LockMode UPGRADE Any associated instances or contained collections will not be selected FOR UPDATI decide to specify lock or all as a cascade style for the association E unless you Es ist mittels der refresh Methode jederzeit m glich ein Objekt und alle seine Collections erneut zu laden Dies ist i
14. Die Verwendung von Ant bei inkrementellen Schema Aktualisierungen Option Beschreibung config hibernate cfg xml eine cfg xml Datei bestimmen You can embed schemaUpdate in your application Configuration Cfg resi new SchemaUpdate cfg execute false 21 1 6 Die Verwendung von Ant bei inkrementellen Schema Aktualisierungen Sie k nnen SchemaUpdate vom Ant Skript aufrufen lt target name schemaupdate gt lt taskdef name schemaupdate classname org hibernate tool hbm2dd1 SchemaUpdateTask classpathref class path gt lt schemaupdate properties hibernate properties quiet no gt lt fileset dir src gt lt include name hbm xml gt lt fileset gt lt schemaupdate gt lt target gt 21 1 7 Schema Validierung The SchemaValidator tool will validate that the existing database schema matches your mapping documents The SchemaValidator depends heavily upon the JDBC metadata API and as such will not work with all JDBC drivers This tool is extremely useful for testing java cp hibernate_classpaths org hibernate tool hbm2ddl SchemaValidator options mapping_files The following table displays the schemaValidator command line options Tabelle 21 5 schemavalidator Befehlszeilenoptionen Option Beschreibung naming eg MyNamingStrategy w hlen Sie eine NamingStrategy Datenbank Properties aus einer Datei lesen properties hibernate properties config shibernate
15. e Sets e Bags All indexed collections maps lists and arrays have a primary key consisting of the lt key gt and lt index gt columns In this case collection updates are extremely efficient The primary key can be efficiently indexed and a particular row can be efficiently located when Hibernate tries to update or delete it Sets have a primary key consisting of lt key gt and element columns This can be less efficient for some types of collection element particularly composite elements or large text or binary fields as the database may not be able to index a complex primary key as efficiently However for one to many or many to many associations particularly in the case of synthetic identifiers it is likely to be just as efficient If you want SchemaExport to actually create the primary key of a lt set gt you must declare all columns as not null true lt idbag gt mappings define a surrogate key so they are efficient to update In fact they are the best case Bags are the worst case since they permit duplicate element values and as they have no index column no primary key can be defined Hibernate has no way of distinguishing between duplicate rows Hibernate resolves this problem by completely removing in a single DELETE and recreating the collection whenever it changes This can be inefficient For a one to many association the primary key may not be the physical primary key of the database tabl
16. lt id name id column addressId gt lt generator class native gt Sl stele lt join table PersonAddress optional true inverse true gt lt key column addressId unique true gt lt many to one name person column personId not null true unique true gt lt join gt lt class gt create table Person personId bigint not null primary key create table PersonAddress personId bigint not null primary key unique addressId bigint not null 133 Kapitel 7 Assoziations Mappings create table Address addressId bigint not null primary key 7 5 3 Many to many Here is an example of a bidirectional many to many association lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt set name addresses table PersonAddress gt lt key column personId gt lt many to many column addressId class Address gt lt set gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt set name people inverse true table PersonAddress gt lt key column addressId gt lt many to many column personId class Person gt lt set gt lt class gt create table Person personId bigint not null primary key create table PersonAddress personId bigint not null addressId bigint not null primary key personlId addressId
17. Hibernate can locate individual rows efficiently and update or delete them individually similar to a list map or set In der aktuellen Implementierung wird die native Bezeichnergenerierungsstrategie nicht f r lt idbag gt Collection Bezeichner unterst tzt 6 4 Collection Beispiele This section covers collection examples The following class has a collection of child instances package eg import java util Set public class Parent private long id private Set children public long getId return id private void setId long id this id id private Set getChildren return children private void setChildren Set children this children children If each child has at most one parent the most natural mapping is a one to many association lt hibernate mapping gt lt class name Parent gt lt id name id gt lt generator class sequence gt lt id gt lt set name children gt lt key column parent_id gt lt one to many class Child gt lt set gt lt class gt 120 Collection Beispiele lt class name Child gt lt id name id gt lt generator class sequence gt lt id gt lt property name name gt lt class gt lt hibernate mapping gt Das mappt zu den folgenden Tabellendefinitionen create table parent id bigint not null primary key create table child alter table child add constraint childfk0 id bigint not null primary key
18. Zweck implementation based on the JDBC metadata returned by the JDBC driver Schreiben Sie alle SQL Anweisungen in die Konsole Es handelt sich dabei um eine Alternative f r die Einstellung der Protokollkategorie org hibernate soL auf debug e g true false SQL in Protokoll und Konsole lesbar ausgeben e g true false Qualify unqualified table names with the given schema tablespace in generated SQL e g SCHEMA_NAME Qualifies unqualified table names with the given catalog in generated SQL e g CATALOG_NAME The org hibernate SessionFactory Will be automatically bound to this name in JNDI after it has been created e g jndi composite name Sets a maximum depth for the outer join fetch tree for single ended associations one to one many to one A 0 disables default outer join fetching e g recommended values between 0 and 3 Sets a default size for Hibernate batch fetching of associations e g recommended values 4 8 16 Sets a default mode for entity representation for all sessions opened from this SessionFactory dynamic map dom4j pojo Forces Hibernate to order SQL updates by the primary key value of the items being updated 37 Kapitel 3 Konfiguration Property Name hibernate generate_statistics hibernate use_identifier_rollback hibernate use_sql_comments Zweck This will result in fewer transaction deadlocks in highly concurrent systems
19. get 0 intValue Die createFilter Methode wird au erdem benutzt um effizient Unters tze einer Collection abzurufen ohne die gesamte Collection zu initialisieren s createFilter lazyCollection setFirstResult 0 setMaxResults 10 list 20 1 5 Die Verwendung von Stapelabruf Batch Fetching Using batch fetching Hibernate can load several uninitialized proxies if one proxy is accessed Batch fetching is an optimization of the lazy select fetching strategy There are two ways you can configure batch fetching on the class level and the collection level Batch fetching for classes entities is easier to understand Consider the following example at runtime you have 25 cat instances loaded in a Session and each cat has a reference to its owner a Person The Person class is mapped with a proxy lazy true If you now iterate through all cats and call getowner on each Hibernate will by default execute 25 sELECT statements to retrieve the proxied owners You can tune this behavior by specifying a batch size in the mapping of Person lt class name Person batch size 10 Des lellais s gt Hibernate will now execute only three queries the pattern is 10 10 5 You can also enable batch fetching of collections For example if each Person has a lazy collection of cats and 10 persons are currently loaded in the session iterating through all persons will generate 10 SELECTS one for every call to
20. inverse optional defaults to false if enabled Hibernate will not insert or update the properties defined by this join 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 For example address information for a person can be mapped to a separate table while preserving value type semantics for all properties lt class name Person table PERSON gt lt id name id column PERSON_ID peat lt join table ADDRESS gt lt key column ADDRESS_ID gt lt property name address gt lt property name zip gt lt property name country gt a VORn gt 92 Key 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 5 1 21 Key The lt key gt element has 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 lt key column columnname on delete noaction cascade 27 property ref propertyName not null true false o update true false unique true false gt column optional
21. 1 0 gt lt DOCTYPE hibernate mapping PUBLIC Hibernate Hibernate Mapping DTD 3 0 EN http hibernate sourceforge net hibernate mapping 3 0 dtd lt ENTITY version 3 5 6 Final gt lt IENTITY today September 15 2010 gt lt ENTITY types SYSTEM classpath your domain types xml gt lt hibernate mapping package your domain gt lt class name MyEntity gt lt id name id type my custom id type gt lt id gt lt class gt amp types lt hibernate mapping gt Where types xm1 is a resource in the your domain package and contains a custom typedef 5 1 2 Hibernate mapping This element has several optional attributes The 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 lt hibernate mapping schema schemaName catalog catalogName default cascade cascade_style default access field property ClassName default lazy true false auto import true false 900990009 package package name schema optional the name of a databa
22. 2 gt Some tags also accept a not null attribute for generating a NoT NULL Constraint on table columns and a unique attribute for generating UNIQUE constraint on table columns lt many to one name bar column barId not null true gt lt element column serialNumber type long not null true unique true gt A unique key attribute can be used to group columns in a single unique key constraint Currently the specified value of the unique key attribute is not used to name the constraint in the generated DDL It is only used to group the columns in the mapping file lt many to one name org column orgId unique key OrgEmployeeld gt lt property name employeeId unique key OrgEmployee gt An index attribute specifies the name of an index that will be created using the mapped column or columns Multiple columns can be grouped into the same index by simply specifying the same index name lt property name lastName index CustName gt lt property name firstName index CustName gt A foreign key attribute can be used to override the name of any generated foreign key constraint lt many to one name bar column barId foreign key FKFooBar gt Zahlreiche Mapping Elemente akzeptieren auch ein untergeordnetes lt column gt Element Das ist insbesondere f r das Mappen von vielspaltigen Typen hilfreich lt property name name type my customtypes Name gt lt column name last not null true
23. IDEAS Hcaterd Cat sux AS cat sex T F Wicat MATE AS eat mate cat SUBCLASS AS Teat celass ssa F FROM CAT cat WHERE ROWNUM lt 10 addEntity cat Cat class aisi SQL queries can contain named and positional parameters just like Hibernate queries More information about native SQL queries in Hibernate can be found in Kapitel 17 Native SQL 10 5 nderungen an persistenten Objekten vornehmen Transactional persistent instances i e objects loaded saved created or queried by the Session can be manipulated by the application and any changes to persistent state will be persisted when the Session is flushed This is discussed later in this chapter There is no need to call a particular 161 Kapitel 10 Das Arbeiten mit method like update which has a different purpose to make your modifications persistent The most straightforward way to update the state of an object is to 10ad it and then manipulate it directly while the Session is open DomesticCat cat cat setName PK DomesticCat sess load Cat class new Long 69 i sess flush changes to cat are automatically detected and persisted Sometimes this programming model is inefficient as it requires in the same session both an SQL SELECT to load an object and an SQL uppateE to persist its updated state Hibernate offers an alternate approach by using detached instances Wichtig Hibernate does not offer its ow
24. addOrder Order asc catName addOrder Order asc kitName Liest Sie k nnen auch Property forName verwenden um Projektionen auszudr cken List results session createCriteria Cat class setProjection Property forName name add Property forName color eq Color BLACK alise e List results session createCriteria Cat class setProjection Projections projectionList add Projections rowCount as catCountByColor add add Property forName color group as color Property forName weight avg as avgWeight add Property forName weight max as maxWeight 234 Abgesetzte Anfragen und Unteranfragen addOrder Order desc catCountByColor addOrder Order desc avgWeight alise g 16 8 Abgesetzte Anfragen und Unteranfragen The DetachedCriteria class allows you to create a query outside the scope of a session and then execute it using an arbitrary Session DetachedCriteria query DetachedCriteria forClass Cat class add Property forName sex eq F Session session Transaction txn session beginTransaction List results query getExecutableCriteria session setMaxResults 100 list txn commit session close A DetachedCriteria can also be used to express a subquery Criterion instances involving subqueries can be obtained via Subqueries Of Property DetachedCrite
25. aid gt lt natural id gt lt property name name gt lt property name org gt lt natural id gt lt property name password gt lt class gt This functionality is not intended for use with entities with mutable natural keys Once you have enabled the Hibernate query cache the Restrictions naturalld allows you to make use of the more efficient cache algorithm session createCriteria User class add Restrictions naturalld set name gavin SEE Torg hpr setCacheable true uniqueResult 236 Native SQL You can also express queries in the native SQL dialect of your database This is useful if you want to utilize database specific features such as query hints or the connect keyword in Oracle It also provides a clean migration path from a direct SQL JDBC based application to Hibernate Hibernate3 allows you to specify handwritten SQL including stored procedures for all create update delete and load operations 17 1 Using A soLQuery Execution of native SQL queries is controlled via the soLQuery interface which is obtained by calling Ssession createSQLQuery The following sections describe how to use this API for querying 17 1 1 Skalare Anfragen Die grundlegendste SQL Anfrage erfolgt durch eine Liste von Skalaren Werten sess createSQLQuery SELECT FROM CATS list sess createSQLQuery SELECT ID NAME BIRTHDATE FROM CATS list These will return a
26. customer id embed xml false gt lt property name balance column BALANCE node balance gt lt class 255 Kapitel 19 XML Mapping 19 1 2 Spezifizierung des Mappens von nur XML Dieses ist ein Beispiel ohne POJO Klasse lt class entity name Account table ACCOUNTS node account gt lt id name id column ACCOUNT_ID node id type string gt lt many to one name customerId column CUSTOMER_ID node customer id embed xml false entity name Customer gt lt property name balance column BALANCE node balance type big_decimal gt lt class gt This mapping allows you to access the data as a dom4j tree or as a graph of property name value pairs or java Maps The property names are purely logical constructs that can be referred to in HQL queries 19 2 XML Mapping Metadaten A range of Hibernate mapping elements accept the node attribute This lets you specify the name of an XML attribute or element that holds the property or entity data The format of the node attribute must be one of the following element name map to the named XML element e attribute name map to the named XML attribute e map to the parent element e element name attribute name map to the named attribute of the named element For collections and single valued associations there is an additional embed xm1 attribute If mbed xml true the default the XML tree for t
27. database row and Java identity only inside a particular session scope When you mix instances retrieved in different sessions you must implement equals and hashCode if you wish to have meaningful semantics for sets The most obvious way is to implement equals hashCode by comparing the identifier value of both objects If the value is the same both must be the same database row because they are equal If both are added to a Set you will only have one element in the set Unfortunately you cannot use that approach with generated identifiers Hibernate will only assign identifier values to objects that are persistent a newly created instance will not have any identifier value Furthermore if an instance is unsaved and currently in a Set saving it will assign an identifier value to the object If equals and hashCode are based on the identifier value the hash code would change breaking the contract of the set See the Hibernate website for a full discussion of this problem This is not a Hibernate issue but normal Java semantics of object identity and equality It is recommended that you implement equals and hashCode using Business key equality Business key equality means that the equals method compares only the properties that form the business key It is a key that would identify our instance in the real world a natural candidate key public class Cat public boolean equals Object other if this other r
28. defined by the class as a natural key and a surrogate key named person_id whose value is generated by a trigger 5 1 5 Enhanced identifier generators 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 73 Kapitel 5 Grundlagen des O R generators described above starting in 3 3 x However they are included in the current releases and can be referenced by FQN The first of these new generators is 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
29. gt afta lt property name alias gt lt one to one name person constrained true gt lt set name works table author_work inverse true gt lt key column author_id gt lt many to many class Work column work_id gt lt set gt lt class gt lt class name Person table persons gt lt id name id column id gt lt generator class native gt ete lt property name name gt lt class gt lt hibernate mapping gt There are four tables in this mapping works authors and persons hold work author and person data respectively author_work is an association table linking authors to works Here is the table schema as generated by SchemaExport create table works id BIGINT not null generated by default as identity tempo FLOAT genre VARCHAR 255 text INTEGER title VARCHAR 255 type CHAR 1 not null primary key id create table author_work author_id BIGINT not null work_id BIGINT not null 306 Kunde Bestellung Produkt primary key work_id author_id create table authors id BIGINT not null generated by default as identity alias VARCHAR 255 primary key id create table persons id BIGINT not null generated by default as identity name VARCHAR 255 primary key id alter table authors add constraint authorsFKO foreign key id references persons alter table author_work add constraint author_workFKO foreign key author_id references auth
30. gt lt id gt lt discriminator column PAYMENT_TYPE type string gt lt property name amount column AMOUNT gt lt subclass name CreditCardPayment discriminator value CREDIT gt lt property name creditCardType column CCTYPE gt lt subclass gt lt subclass name CashPayment discriminator value CASH gt lt subclass gt lt subclass name ChequePayment discriminator value CHEQUE gt lt subclass gt lt class gt Exactly one table is required There is a limitation of this mapping strategy columns declared by the subclasses such as CcTYPE cannot have noT NULL Constraints 9 1 2 Tabelle pro Subklasse A table per subclass mapping looks like this lt class name Payment table PAYMENT gt lt id name id type long column PAYMENT_ID gt lt generator class native gt lt id gt lt property name amount column AMOUNT gt lt joined subclass name CreditCardPayment table CREDIT_PAYMENT gt lt key column PAYMENT_ID gt lt property name creditCardType column CCTYPE gt lt joined subclass gt lt joined subclass name CashPayment table CASH_PAYMENT gt lt key column PAYMENT_ID gt lt joined subclass gt lt joined subclass name ChequePayment table CHEQUE_PAYMENT gt lt key column PAYMENT_ID gt lt joined subclass gt lt class gt Four tables are required The three subclass tables have primary key associations to the su
31. hibernate jdbc use_get_generated_keys hibernate connection provider_class hibernate connection isolation Zweck applications will not need this configuration property e g classname of BatcherFactory Enables use of JDBC2 scrollable resultsets by Hibernate This property is only necessary when using user supplied JDBC connections Hibernate uses connection metadata otherwise e g true false Use streams when writing reading binary or serializable types to from JDBC system level property e 9 true false Enables use of JDBC3 PreparedStatement getGeneratedKeys to retrieve natively generated keys after insert Requires JDBC3 driver and JRE1 4 set to false if your driver has problems with the Hibernate identifier generators By default it tries to determine the driver capabilities using connection metadata e g true false The classname of a custom org hibernate connection ConnectionProvider which provides JDBC connections to Hibernate e g classname of ConnectionProvider Sets the JDBC transaction isolation level Check java sql Connection for meaningful values but note that most databases do not support all isolation levels and some define additional non standard isolations e 9 1 2 4 8 hibernate connection autocommit Enables autocommit for JDBC pooled connections it is not recommended e g true false 39 Kapitel 3 Konfiguration Property Name hiberna
32. lt composite id gt In this example both the composite identifier class Medicaretd and the entity class itself have properties named medicareNumber and dependent The identifier class must override equals and hashCode and implement Serializable The main disadvantage of this approach is code duplication Die folgenden Attribute werden verwendet um einen gemappten zusammengesetzten Bezeichner zu bestimmen mapped optional defaults to false indicates that a mapped composite identifier is used and that the contained property mappings refer to both the entity class and the composite identifier class class optional but required for a mapped composite identifier the class used as a composite identifier We will describe a third even more convenient approach where the composite identifier is implemented as a component class in Abschnitt 8 4 Komponenten als zusammengeseizte Bezeichner The attributes described below apply only to this alternative approach name optional required for this approach a property of component type that holds the composite identifier Please see chapter 9 for more information access optional defaults to property the strategy Hibernate uses for accessing the property value class optional defaults to the property type determined by reflection the component class used as a composite identifier Please see the next section for more information 76 Discrimi nator
33. or by a trigger or other application formula optional ein SQL Ausdruck der den Wert f r eine errechnete Property definiert Errechnete Properties besitzen kein eigenes Spalten Mapping access optional defaults to property the strategy Hibernate uses for accessing the property value 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 unique optional enables the DDL generation of a unique constraint for the columns Also allow this to be the target of a property ref not null optional enables the DDL generation of a nullability constraint for the columns 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 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 typename k nnte sein 1 The name of a Hibernate basic type integer string character date timestamp float binary serializable object blob etc 2 The name of a Java class with a default basic type int float char java lang String java util Date java lang Integer java sql Clob etc 80
34. returns instances not only of Cat but also of subclasses like Domesticcat Hibernate queries can name any Java class or interface in the from clause The query will return instances of all persistent classes that extend that class or implement the interface The following query would return all persistent objects 214 Die where Klausel from java lang Object o Das Interface Named k nnte durch verschiedene persistente Klassen implementiert werden from Named n Named m where n name m name These last two queries will require more than one SQL sELecr This means that the order by clause does not correctly order the whole result set It also means you cannot call these queries using Query scroll 15 9 Die where Klausel The where clause allows you to refine the list of instances returned If no alias exists you can refer to properties by name from Cat where name Fritz Falls ein Alias existiert verwenden Sie einen vollst ndigen Property Namen from Cat as cat where cat name Fritz This returns instances of cat named Fritz The following query select Foo from Foo foo Bar bar where foo startDate bar date returns all instances of Foo with an instance of var with a date property equal to the startDate property of the Foo Compound path expressions make the where clause extremely powerful Consider the following from Cat cat where cat mate name is not null This query translates to a
35. serialNumber sn The actual interface might be java util Set java util Collection java util List java util Map java util SortedSet java util SortedMap Or anything you like anything you like means you will have to write an implementation of org hibernate usertype UserColl ctionType Notice how the instance variable was initialized with an instance of HashSet This is the best way to initialize collection valued properties of newly instantiated non persistent instances When you make the instance persistent by calling persist for example Hibernate will actually replace the HashSet with an instance of Hibernate s own implementation of set Be aware of the following errors Cat cat new DomesticCat Cat kitten new DomesticCat Set kittens new HashSet kittens add kitten cat setKittens kittens session persist cat kittens cat getKittens Okay kittens collection is a Set HashSet cat getKittens Error The persistent collections injected by Hibernate behave like HashMap HashSet TreeMap TreeSet or ArrayList depending on the interface type Collections instances have the usual behavior of value types They are automatically persisted when referenced by a persistent object and are automatically deleted when unreferenced If a collection is passed from one persistent object to another its elements might be moved from one table to another Two entities cannot share a reference to
36. 1 Arbeitgeber Arbeitnehmer The following model of the relationship between Employer and Employee uses an entity class Employment to represent the association You can do this when there might be more than one period of employment for the same two parties Components are used to model monetary values and employee names Employer employar Oe Employment id long startDate Date name String endDate Date getld long id long setldLid long getStartDated Date getNamed String setStartDatestartDate Date setNameLname string getEndDated Date setEndDateLendDate Date getHourlyRated MonetoryAmount setHourlyRate rate MonetoryAmount getidd long setidLid long getEmployerd Employer setEmployertemp Employen getEmployeed Employee setEmployeetemp Employee Employee id long taxfileNumber String getNamed Name setNameiname Name getld long setldLid long getTaxfileNumberd String setTaxfileNumber taxfileNumberString employee a MonetoryAmount amount BigDecimal currency Currency getAmount BigDecimal setAmountLamount BigDecimal getCurrencyd Currency setCurrency currency Currency Here is a possible mapping document lt hibernate mapping gt lt class name Employer table employers gt lt id name id gt lt generator class sequence gt lt param name sequence gt employ
37. 2 3 Bidirectional associations 11 2 3 1 Bidirectional one to one If aread only entity owns a bidirectional one to one association Hibernate does not dirty check the association updates that change the association reference to null or to refer to a different entity will not be flushed to the database If automatic versioning is used Hibernate will not increment the version due to local changes to the association When the owner is not read only Hibernate treats an association with a read only entity the same as when the association is with an entity that is not read only 11 2 3 2 Bidirectional one to many many to one A read only entity has no impact on a bidirectional one to many many to one association if the read only entity is on the one to many side using an inverse collection the read only entity is on the one to many side using a non inverse collection e the one to many side uses a non inverse collection that contains the read only entity When the one to many side uses an inverse collection e a read only entity can only be added to the collection when it is created a read only entity can only be removed from the collection by an orphan delete or by explicitly deleting the entity 11 2 3 3 Bidirectional many to many Hibernate treats bidirectional many to many associations owned by a read only entity the same as when owned by an entity that is not read only 179 Kapitel 11 Re
38. 5 1 22 Column and formula elements Mapping elements which accept a column attribute will alternatively accept a lt column gt subelement Likewise lt formula gt is an alternative to the formula attribute For example 93 Kapitel 5 Grundlagen des O R lt column name column_name length N precision N scale N not null true false unique true false unique key multicolumn_unique_key_name index index_name sql type sql_type_name check SOL expression default SOL expression read SOL expression write SOL expression gt lt formula gt SQL expression lt formula gt Most of the attributes on 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 The column and formula elements can even be combined within the same property or association mapping to express for example exotic join conditions lt many to one name homeAddress class Address insert false update false gt lt column name person_id not null true length 10 gt lt formula gt MAILING lt formula gt lt many to one gt 5 1 23 Import 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
39. Association mappings are often the most difficult thing to implement correctly In this section we examine some canonical cases one by one starting with unidirectional mappings and then bidirectional cases We will use Person and Address in all the examples Associations will be classified by multiplicity and whether or not they map to an intervening join table Nullable foreign keys are not considered to be good practice in traditional data modelling so our examples do not use nullable foreign keys This is not a requirement of Hibernate and the mappings will work if you drop the nullability constraints 7 2 Unidirektionale Assoziationen 7 2 1 Many to one Eine unidirektionale Many to One Assoziation ist der Assoziationen lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt many to one name address column addressId not null true gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt class gangigste Typ unidirektionaler create table Person personId bigint not null primary key addressId bigint not null create table Address addressId bigint not null primary key 7 2 2 One to one Eine unidirektionale One to One Assoziation an einem Fremdschl ssel ist fast identisch Der einzige Unterschied besteht in der Spalte der eindeutigen Bedingung 1
40. Bidirektionale Assoziationen mit indizierten Collections 118 6 3 4 Dreifache Assoziationen uusnssennnnsennennnnnnnnnnnnnnnennnnnnnnnnnnnnn nn nnnnnnen 119 6 3 5 Using an lt idbag gt nn a aniline yee 119 6 4 Collection Beispiele uususnsnnnnnnnnnennnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnennn 120 7 Assoziations MappingS unse 125 7 1 EiNf hring esse ee 125 7 2 Unidirektionale Assoziationen 4444ssennnnennnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn 125 T k MAy TONE a en nnenkir 125 1 2 2 Ne t0 ONe an neuen E aaas 125 7 2 39 Oneto MaN en E E E ES 127 7 3 Unidirektionale Assoziationen mit Verbundtabellen 44444Hnnn ernennen 127 1 3 1 Ohe f0 MaNny nasse anna ana T a ana nandenn nenne 127 1 3 2 Many TOONE ann na EET 128 7 9 3 ONE IO ONE nina ee eek 128 13 4 M ny lo Many e energie 129 7 4 Bidirektionale Assoziationen uuzrrsr0snnnnnennnnnennnnnnnennnnnnnnnnn nennen nnnnenennnnnnnn 130 7 4 1 one to many MaNy tO ONE uueenssseennnsnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnennnnn 130 1 4 2 ON amp 10 ONe ortam a a ea rear ange cap tapbacwsabeetear cone 131 7 5 Bidirektionale Assoziationen mit Verbundtabellen 444444nnn nn 132 7 5 1 one to many MANY tO ONE ueenssseeeennsnennnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn 132 79 2 Oneto ONE nn ee i date mies 133 T3 MANY 1O2 MANY une
41. Cache der zweiten Ebene gibt es in der SessionFactory definierte Methoden um den gecachten Status einer Instanz gesamten Klasse Collection Instanz oder der gesamten Collection Rolle zu r umen sessionFactory evict Cat class catId evict a particular Cat sessionFactory evict Cat class evict all Cats sessionFactory evictCollection Cat kittens catId evict a particular collection of kittens sessionFactory evictCollection Cat kittens evict all kitten collections The cacheMode controls how a particular session interacts with the second level cache e CacheMode NORMAL Will read items from and write items to the second level cache e CacheMode G ET will read items from the second level cache Do not write to the second level cache except when updating data CacheMode PUT Will write items to the second level cache Do not read from the second level cache e CacheMode R EFR ESH Will write items to the second level cache Do not read from the second level cache Bypass the effect of hibernate cache use_minimal_puts forcing a refresh of the second level cache for all items read from the database Um die Inhalte eines Cache der zweiten Ebene oder eines Cache Bereichs zu durchsuchen verwenden Sie die statistics API Map cacheEntries sessionFactory getStatistics getSecondLevelCacheStatistics regionName getEntries You will need to enable statistics and optiona
42. Collections Hibernate collections are considered to be a logical part of their owning entity and not of the contained entities Be aware that this is a critical distinction that has the following consequences When you remove add an object from to a collection the version number of the collection owner is incremented If an object that was removed from a collection is an instance of a value type e g a composite element that object will cease to be persistent and its state will be completely removed from the database Likewise adding a value type instance to the collection will cause its state to be immediately persistent Conversely if an entity is removed from a collection a one to many or many to many association it will not be deleted by default This behavior is completely consistent a change to the internal state of another entity should not cause the associated entity to vanish Likewise adding an entity to a collection does not cause that entity to become persistent by default Adding an entity to a collection by default merely creates a link between the two entities Removing the entity will remove the link This is appropriate for all sorts of cases However it is not appropriate in the case of a parent child relationship In this case the life of the child is bound to the life cycle of the parent 22 2 Bidirektionales One to Many Gehen wir einmal davon aus wir wollten mit einer einfachen lt one to many gt Assoz
43. Kapitel 10 Das Arbeiten mit Die Bindung und Ausf hrung der Parameter erfolgen befehlsorientiert Query q sess getNamedQuery ByNameAndMaximumWeight q setString 0 name q setInt 1 minWeight List gats qg LISEYI The actual program code is independent of the query language that is used You can also define native SQL queries in metadata or migrate existing queries to Hibernate by placing them in mapping files Also note that a query declaration inside a lt hibernate mapping gt element requires a global unique name for the query while a query declaration inside a lt class gt element is made unique automatically by prepending the fully qualified name of the class For example eg Cat ByNameAndMaximumWeight 10 4 2 Das Filtern von Collections A collection filter is a special type of query that can be applied to a persistent collection or array The query string can refer to this meaning the current collection element Collection blackKittens session createFilter pk getKittens where this color setParameter Color BLACK Hibernate custom ColorUserType class a ete The returned collection is considered a bag that is a copy of the given collection The original collection is not modified This is contrary to the implication of the name filter but consistent with expected behavior Observe that filters do not require a from clause although they can have one if required Filters are not lim
44. String hqlVersionedUpdate update versioned Customer set name newName where name oldName int updatedEntities s createQuery hqlUpdate setString newName newName setString oldName oldName executeUpdate Gx commuaktes i session close Custom version types org hibernate usertype UserVersionType are not allowed in conjunction with a update versioned statement Um HQL pELETEauszuf hren verwenden Sie dieselbe Query execut eUpdate Methode Session session sessionFactory openSession Transaction tx session beginTransaction String hqlDelete delete Customer c where c name oldName or String hqlDelete delete Customer where name oldName int deletedEntities s createQuery hqlDelete setString oldName oldName executeUpdate tx commit session close The int value returned by the Query executeUpdate method indicates the number of entities effected by the operation This may or may not correlate to the number of rows effected in the database An HQL bulk operation might result in multiple actual SQL statements being executed for joined subclass for example The returned number indicates the number of actual entities affected by the statement Going back to the example of joined subclass a delete against one 206 Vorg nge im DML Stil of the subclasses may actually result in deletes against not just the table to which t
45. The user clicks Save after 5 minutes and expects their modifications to be made persistent The user also expects that they were the only person editing this information and that no conflicting modification has occurred From the point of view of the user we call this unit of work a long running conversation or application transaction There are many ways to implement this in your application A first naive implementation might keep the session and database transaction open during user think time with locks held in the database to prevent concurrent modification and to guarantee isolation and atomicity This is an anti pattern since lock contention would not allow the application to scale with the number of concurrent users You have to use several database transactions to implement the conversation In this case maintaining isolation of business processes becomes the partial responsibility of the application tier A single conversation usually spans several database transactions It will be atomic if only one of these database transactions the last one stores the updated data All others simply read data for example in a wizard style dialog spanning several request response cycles This is easier to implement than it might sound especially if you utilize some of Hibernate s features Automatic Versioning Hibernate can perform automatic optimistic concurrency control for you It can automatically detect if a concurrent modification occurr
46. TransactionFactory Ein von der JTATransactionFactory zum Erhalt der JTA UserTransaction vom Applikationsserver verwendeter JNDI Name e g jndi composite name hibernate transaction manager_lookup_cl he classname of a TransactionManagerLookup It is required when JVM level caching is enabled or when using hilo generator in a JTA environment 41 Kapitel 3 Konfiguration Property Name Zweck e g classname of TransactionManagerLookup hibernate transaction flush_before_compl ienabled the session will be automatically flushed during the before completion phase of the transaction Built in and automatic session context management is preferred see Abschnitt 2 5 Contextual sessions e g true false hibernate transaction auto_close_sessioff enabled the session will be automatically closed during the after completion phase of the transaction Built in and automatic session context management is preferred see Abschnitt 2 5 Contextual sessions e g true false Tabelle 3 7 Verschiedene Properties Property Name Zweck hibernate current_session_context_class Supply a custom strategy for the scoping of the current Session See Abschnitt 2 5 Contextual sessions for more information about the built in strategies e g jta thread managed custom Class hibernate query factory_class W hlt die Implemetierung des HQL Parsers Analysealgorithmus e g org hibernate hql
47. above mentioned benefits of using the XML syntax With the XML configuration starting Hibernate is then as simple as SessionFactory sf new Configuration configure buildSessionFactory You can select a different XML configuration file using SessionFactory sf new Configuration configure catdb cfg xml buildSessionFactory 47 Kapitel 3 Konfiguration 3 8 Integration des J2EE Applikationsservers Hibernate besitzt die folgenden Intergrationspunkte f r die J2EE Infrastruktur Container managed datasources Hibernate can use JDBC connections managed by the container and provided through JNDI Usually a JTA compatible TransactionManager and a ResourceManager take care of transaction management CMT especially distributed transaction handling across several datasources You can also demarcate transaction boundaries programmatically BMT or you might want to use the optional Hibernate Transaction API for this to keep your code portable Automatisches JNDI Binding Hibernate kann seine SessionFactory nach dem Startup an JNDI binden JTA Session binding the Hibernate session can be automatically bound to the scope of JTA transactions Simply lookup the sessionFactory from JNDI and get the current session Let Hibernate manage flushing and closing the session when your JTA transaction completes Transaction demarcation is either declarative CMT or programmatic BMT UserTransaction JMX deploymen
48. alias emp class Employment gt lt return property name employee column EMPLOYEE gt lt return property name employer column EMPLOYER gt lt return property name startDate column STARTDATE gt lt return property name endDate column ENDDATE gt lt return property name regionCode column REGIONCODE gt lt return property name id column EID gt lt return property name salary gt lt return column name VALUE gt lt return column name CURRENCY gt lt return property gt lt return gt call selectAllEmployments lt sql query gt Stored procedures currently only return scalars and entities lt return join gt and lt load collection gt are not supported 17 2 2 1 Regeln Einschrankungen bei der Verwendung gespeicherter Prozeduren You cannot use stored procedures with Hibernate unless you follow some procedure function rules If they do not follow those rules they are not usable with Hibernate If you still want to use these procedures you have to execute them via session connection The rules are different for each database since database vendors have different stored procedure semantics syntax Stored procedure queries cannot be paged with setFirstResult setMaxResults 245 Kapitel 17 Native SQL The recommended call form is standard SQL92 call functionName lt parameters gt or call procedureName lt parameters gt Native call syntax is n
49. 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 84 One to one if constrained false proxying is impossible and Hibernate will eagerly fetch the association iD entity name optional the entity name of the associated class There are two varieties of one to one associations Assoziationen des Prim rschl ssels Assoziationen eines eindeutigen Fremdschl ssels 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 For a primary key association add the following mappings to Employee and Person respectively lt one to one name person class Person gt lt one to one name employee class Employee constrained true gt 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 foreign lt class name person table PERSON gt lt id name id column PERSON_ID gt lt generator class foreign gt lt param name property gt employee lt param gt lt generator
50. cache use_second_level_cache false Dies ist jedoch nicht unbedingt erforderlich da der cacheMode so eingestellt werden kann dass die Interaktion mit dem Cache der zweiten Ebene deaktiviert ist 14 1 Batch Einfugungen Batch Inserts When making new objects persistent flush and then clear the session regularly in order to control the size of the first level cache Session session sessionFactory openSession Transaction tx session beginTransaction for eine 10 2 121700000 Zr aa 203 Kapitel 14 Batch Verarbeitung Customer customer new Customer IR session save customer if i 20 0 20 same as the JDBC batch size flush a batch of inserts and release memory session flush session clear er eommaker i7 session close 14 2 Batch Aktualisierungen For retrieving and updating data the same ideas apply In addition you need to use scrol1 to take advantage of server side cursors for queries that return many rows of data Session session sessionFactory openSession Transaction tx session beginTransaction ScrollableResults customers session getNamedQuery GetCustomers setCacheMode CacheMode IGNORE scroll ScrollMode FORWARD_ONLY int count 0 while customers next Customer customer Customer customers get 0 customer updateStuff Tf er recunts 20 20 flush a batch of updates and release memory session flush
51. 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 An entity s persistent state consists of references to other entities and instances of 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 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 componentis 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
52. cfg xml eine c fg xm1 Datei bestimmen 287 Kapitel 21 Toolset Handbuch You can embed SchemaValidator in your application Configuration erg nee new SchemaValidator cfg validate 21 1 8 Die Verwendung von Ant zur Schema Validierung Sie k nnen SchemaValidator vom Ant Skript aus aufrufen lt target name schemavalidate gt lt taskdef name schemavalidator classname org hibernate tool hbm2ddl SchemaValidatorTask classpathref class path gt lt schemavalidator properties hibernate properties gt lt fileset dir src gt lt include name hbm xml gt lt fileset gt lt schemavalidator gt lt target gt 288 Beispiel Parent Child One of the first things that new users want to do with Hibernate is to model a parent child type relationship There are two different approaches to this The most convenient approach especially for new users is to model both Parent and child as entity classes with a lt one to many gt association from Parent to Child The alternative approach is to declare the child as a lt composite element gt The default semantics of a one to many association in Hibernate are much less close to the usual semantics of a parent child relationship than those of a composite element mapping We will explain how to use a bidirectional one to many association with cascades to model a parent child relationship efficiently and elegantly 22 1 Eine Anmerkung zu
53. closing the session You can force initialization by calling cat getSex Of cat getKittens size for example However this can be confusing to readers of the code and it is not convenient for generic code The static methods Hibernate initialize and Hibernate isInitialized provide the application with a convenient way of working with lazily initialized collections or proxies Hibernate initialize cat Will force the initialization of a proxy cat as long as its Sessionis still open Hibernate initialize cat getKittens has a similar effect for the collection of kittens Another option is to keep the Session open until all required collections and proxies have been loaded In some application architectures particularly where the code that accesses data using Hibernate and the code that uses it are in different application layers or different physical processes it can be a problem to ensure that the Session is open when a collection is initialized There are two basic ways to deal with this issue In a web based application a servlet filter can be used to close the Session only at the end of a user request once the rendering of the view is complete the Open Session in View pattern Of course this places heavy demands on the correctness of the exception handling of your application infrastructure It is vitally important that the session is closed and the transaction ended before returning to the user even when an exception oc
54. configuration 3 0 dtd gt lt hibernate configuration gt lt session factory gt lt Database connection settings gt lt property name connection driver_class gt org hsqldb jdbcDriver lt property gt lt property name connection url gt jdbc hsqldb hsql localhost lt property gt lt property name connection username gt sa lt property gt lt property name connection password gt lt property gt lt l JDBC connection pool use the built in gt lt property name connection pool_size gt 1 lt property gt HC Sordi alech gt lt property name dialect gt org hibernate dialect HSQLDialect lt property gt lt Enable Hibernate s automatic session context management gt lt property name current_session_context_class gt thread lt property gt lt Disable the second level cache gt lt property name cache provider_class gt org hibernate cache NoCacheProvider lt property gt Sl Echo all executed SOL EO stdout lt property name show_sql gt true lt property gt lt Drop and re create the database schema on startup gt lt property name hbm2ddl auto gt update lt property gt lt mapping resource org hibernate tutorial domain Event hbm xml gt Building with Maven lt session factory gt lt hibernate configuration gt You configure Hibernate s SessionFactory SessionFactory is a global factory responsi
55. create such a data structure and how to extract values from and inject values into such a data structure For example for the POJO entity mode the corresponding tuplizer knows how create the POJO through its constructor It also knows how to access the POJO properties using the defined property accessors There are two high level types of Tuplizers represented by the org hibernate tuple entity EntityTuplizer and org hibernate tuple component ComponentTuplizer interfaces EntityTuplizerS are responsible for managing the above mentioned contracts in regards to entities while Component Tuplizers do the same for components Users can also plug in their own tuplizers Perhaps you require that a java util Map implementation other than java util HashMap be used while in the dynamic map entity mode Or perhaps you need to define a different proxy generation strategy than the one used by default Both would be achieved by defining a custom tuplizer implementation Tuplizer definitions are attached to the entity or component mapping they are meant to manage Going back to the example of our customer entity 59 Kapitel 4 Persistente Klassen lt hibernate mapping gt lt class entity name Customer gt SZ Override the dynamic map entity mode tuplizer for the customer entity gt lt tuplizer entity mode dynamic map class CustomMapTuplizerImpl gt lt id name id type long column ID gt lt generator class
56. e g true false Falls aktiviert so sammelt Hibernate Statistiken die bei der Feinabstimmung der Performance von Nutzen sind e 9 true false Falls aktiviert so werden die generierten Bezeichner Properties auf die Standardwerte zur ckgesetzt wenn Objekte gel scht werden e g true false Falls eingeschaltet generiert Hibernate Kommentare innerhalb der SQL f r eine vereinfachte Fehlersuche Die Standardeinstellung lautet false e g true false Tabelle 3 4 Hibernate JDBC und Connection Properties Property Name Zweck hibernate jdbc fetch_size hibernate jdbc batch_size hibernate jdbc batch_versioned_data Ein Wert ungleich Null bestimmt die Anzahl der JDBC Datens tze den so genannten Fetch Size ruft Statement setFetchSize auf Ein Wert von ungleich Null aktiviert die Verwendung von JDBC2 Stapelaktualisierungen sog Batch Updates durch Hibernate e g recommended values between 5 and 30 Set this property to true if your JDBC driver returns correct row counts from executeBatch It is usually safe to turn this option on Hibernate will then use batched DML for automatically versioned data Defaults to false e g true false hibernate jdbc factory_class Select a custom org hibernate jdbc Batcher Most 38 Optionale Properties der Konfiguration Property Name hibernate jdbc use_scrollable_resultset hibernate jdbc use_streams_for_binary
57. each reference will result in a separate instance of that class If you need to share listener instances between listener types you must use the programmatic registration approach Why implement an interface and define the specific type during configuration A listener implementation could implement multiple event listener interfaces Having the type additionally defined during registration makes it easier to turn custom listeners on or off during configuration 13 3 Deklarative Sicherheit in Hibernate Usually declarative security in Hibernate applications is managed in a session facade layer Hibernate3 allows certain actions to be permissioned via JACC and authorized via JAAS This is an optional functionality that is built on top of the event architecture Zun chst einmal m ssen die betreffenden Event Listener konfiguriert werden damit die Verwendung der JAAS Authorisierung aktiviert ist lt listener type pre delete class org hibernate secure JACCPreDeleteEventListener gt lt listener type pre update class org hibernate secure JACCPreUpdateEventListener gt lt listener type pre insert class org hibernate secure JACCPreInsertEventListener gt lt listener type pre load class org hibernate secure JACCPreLoadEventListener gt Note that lt listener type class gt is shorthand for lt event type gt lt listener class gt lt event gt when there is exactly one listener for a particular event
58. easily used in expressions by declaring HQL query substitutions in Hibernate configuration lt property name hibernate query substitutions gt true 1 false 0 lt property gt Das ersetzt die Schl sselbegriffe true und false durch die Literale 1 und 0 in der aus dieser HQL bersetzten SQL from Cat cat where cat alive true You can test the size of a collection with the special property size or the special size function from Cat cat where cat kittens size Ol from Cat cat where size cat kittens 10 218 Ausdr cke For indexed collections you can refer to the minimum and maximum indices using minindex and maxindex functions Similarly you can refer to the minimum and maximum elements of a collection of basic type using the minelement and maxelement functions For example from Calendar cal where maxelement cal holidays gt current_date from Order order where maxindex order items gt 0 from Order order where minelement order items gt 10000 The SQL functions any some all exists in are supported when passed the element or index set of a collection elements and indices functions or the result of a subquery see below select mother from Cat as mother Cat as kit where kit in elements foo kittens select p from NameList list Person p where p name some elements list names from Cat cat where exists elements cat kittens from Player p where 3 gt all elements p score
59. equality There is one caveat never use the database identifier to implement equality Use a business key that is a combination of unique usually immutable attributes The database identifier will change if a transient object is made persistent If the transient instance usually together with detached instances is held in a set changing the hashcode breaks the contract of the set Attributes for business keys do not have to be as stable as database primary keys you only have to guarantee stability as long as the objects are in the same Set See the Hibernate website for a more thorough discussion of this issue Please note that this is not a Hibernate issue but simply how Java object identity and equality has to be implemented 12 1 4 Gangige Probleme Do not use the anti patterns session per user session or session per application there are however rare exceptions to this rule Some of the following issues might also arise within the recommended patterns so ensure that you understand the implications before making a design decision e A Session is not thread safe Things that work concurrently like HTTP requests session beans or Swing workers will cause race conditions if a Session instance is shared If you keep your Hibernate Session in your HttpSession this is discussed later in the chapter you should consider synchronizing access to your Http session Otherwise a user that clicks reload fast enough can use the same Session in
60. f r s mtliche Children ebenfalls merge Falls f r einen Parent save update Oder saveOrUpdate gilt so gilt f r s mtliche Children ebenfalls saveorUpdate Falls auf ein transientes oder abgesetztes Child durch einen persistenten Parent verwiesen wird so gilt daf r saveorUpdate Falls ein Parent gel scht wird so gilt f r alle Children delete Falls der Verweis auf ein Child von einem persistenten Parent entf llt passiert nicht besonderes die Anwendung sollte das Child explizit l schen falls n tig au er es gilt cascade delete orphan in welchem Fall das verwaiste Child gel scht wird Finally note that cascading of operations can be applied to an object graph at call time or at flush time All operations if enabled are cascaded to associated entities reachable when the operation is executed However save update and delete orphan are transitive for all associated entities reachable during flush of the Session 10 12 Die Verwendung von Metadata Hibernate requires a rich meta level model of all entity and value types This model can be useful to the application itself For example the application might use Hibernate s metadata to implement a smart deep copy algorithm that understands which objects should be copied eg mutable value types and which objects that should not e g immutable value types and possibly associated entities Hibernate exposes metadata via the Class
61. getcats If you enable batch fetching for the cats collection in the mapping of Person Hibernate can pre fetch collections lt class name Person gt lt set name cats batch size 3 gt lt set gt lt class gt With a batch size of 3 Hibernate will load 3 3 3 1 collections in four sELECTS Again the value of the attribute depends on the expected number of uninitialized collections in a particular Session 267 Kapitel 20 Verbesserung der Batch fetching of collections is particularly useful if you have a nested tree of items i e the typical bill of materials pattern However a nested set or a materialized path might be a better option for read mostly trees 20 1 6 Die Verwendung von Subselect Fetching If one lazy collection or single valued proxy has to be fetched Hibernate will load all of them re running the original query in a subselect This works in the same way as batch fetching but without the piecemeal loading 20 1 7 Fetch profiles Another way to affect the fetching strategy for loading associated objects is through something called a fetch profile which is a named configuration associated with the org hibernate SessionFactory but enabled by name on the org hibernate Session Once enabled on a org hibernate Session the fetch profile wull be in affect for that org hibernate Session until it is explicitly disabled So what does that mean Well lets expla
62. gt lt generator class native gt lt i gt lt set name addresses gt lt key column personId not null true gt lt one to many class Address gt lt set gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt class gt create table Person personId bigint not null primary key create table Address addressId bigint not null primary key personId bigint not null You should instead use a join table for this kind of association 7 3 Unidirektionale Assoziationen mit Verbundtabellen 7 3 1 One to many A unidirectional one to many association on a join table is the preferred option Specifying unique true changes the multiplicity from many to many to one to many lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt set name addresses table PersonAddress gt lt key column personId gt lt many to many column addressId unique true class Address gt lt set gt lt class gt lt class name Address gt 127 Kapitel 7 Assoziations Mappings lt id name id column addressId gt lt generator class native gt lt id gt lt class gt create table Person personId bigint not null primary key create table PersonAddress personId not null addressId bigint not null primary key create table Address addres
63. gt lt key column PAYMENT_ID gt lt join gt lt subclass gt elass gt Durch die optionale fetch select Deklaration ruft Hibernate die ChequePayment Subklassendaten unter Verwendung eines u eren Verbunds sog outer Join bei Anfragen an die Superklasse nicht auf 9 1 4 Das Mischen der Tabelle pro Klasse Hierarchie mit Tabelle pro Subklasse You can even mix the table per hierarchy and table per subclass strategies using the following approach lt class name Payment table PAYMENT gt lt id name id type long column PAYMENT_ID gt 147 Kapitel 9 Inheritance mapping lt generator class native gt lt i gt lt discriminator column PAYMENT_TYPE type string gt lt property name amount column AMOUNT gt lt subclass name CreditCardPayment discriminator value CREDIT gt lt join table CREDIT_PAYMENT gt lt property name creditCardType column CCTYPE gt lt join gt lt subclass gt lt subclass name CashPayment discriminator value CASH gt lt subclass gt lt subclass name ChequePayment discriminator value CHEQUE gt lt subclass gt lt class gt Bei allen diesen Mapping Strategien wird eine polymorphe Assoziation zur Stamm Payment Klasse mittels lt many to one gt gemappt lt many to one name payment column PAYMENT_ID class Payment gt 9 1 5 Tabelle pro konkrete Klasse There are two ways we can map the table per c
64. he 299 Kapitel 23 Beispiel Web Log finally session close return item public void updateBlogItem BlogItem item String text throws HibernateException item setText text Session session _sessions openSession Transaction tx null try tx session beginTransaction session update item tx commit catch HibernateException he f Ex null tx rollback iy throw he finally session close public void updateBlogItem Long itemid String text throws HibernateException Session session _sessions openSession Transaction tx null ery tx session beginTransaction BlogItem item BlogItem session load BlogItem class itemid item setText text tx commit catch HibernateException he if ex Znull t2 rellibaekil throw he finally session close public List listAllBlogNamesAndItemCounts int max throws HibernateException Session session _sessions openSession Transaction tx null List result null Cry tx session beginTransaction Query q session createQuery select blog id blog name count blogItem from Blog as blog left outer join blog items as blogItem 300 Hibernate Code gt tgroup by blog name biog aid NH order by max blogItem datetime i q setMaxResults max result q list tx commit catch HibernateException he f
65. in current session context management Non managed environment idiom with getCurrentSession try factory getCurrentSession beginTransaction do some work factory getCurrentSession getTransaction commit catch RuntimeException e factory getCurrentSession getTransaction rollback throw e or display error message You will not see these code snippets in a regular application fatal system exceptions should always be caught at the top In other words the code that executes Hibernate calls in the persistence layer and the code that handles RuntimeException and usually can only clean up 186 Die Verwendung von JTA and exit are in different layers The current context management by Hibernate can significantly simplify this design by accessing a SessionFactory Exception handling is discussed later in this chapter You should select org hibernate transaction JDBCTransactionFactory Which is the default and for the second example select thread as your hibernate current_session_context_class 12 2 2 Die Verwendung von JTA If your persistence layer runs in an application server for example behind EJB session beans every datasource connection obtained by Hibernate will automatically be part of the global JTA transaction You can also install a standalone JTA implementation and use it without EJB Hibernate offers two strategies for JTA integration If you use bean ma
66. in a new session secondSession update cat update cat secondSession update mate update mate 162 Automatische Statuserkennung W re cat mit Bezeichner cat da bereits durch secondSession geladen worden wenn die Anwendung die Wiederanbindung durchzuf hren versucht h tte so w re eine Ausnahme gemeldet worden Use update if you are certain that the session does not contain an already persistent instance with the same identifier Use merge if you want to merge your modifications at any time without consideration of the state of the session In other words update is usually the first method you would call in a fresh session ensuring that the reattachment of your detached instances is the first operation that is executed The application should individually update detached instances that are reachable from the given detached instance only if it wants their state to be updated This can be automated using transitive persistence See Abschnitt 10 11 Transitive Persistenz for more information The 1ock method also allows an application to reassociate an object with a new session However the detached instance has to be unmodified just reassociate sess lock fritz LockMode NONE do a version check then reassociate sess lock izi LockMode READ do a version check using SELECT FOR UPDATE then reassociate sess lock pk LockMode UPGRADE Note that lock can be used with
67. in addition to a class name lt hibernate mapping gt lt class entity name Customer gt lt id name id type long column ID gt lt generator class sequence gt lt id gt lt property name name 57 Kapitel 4 Persistente Klassen column NAME type string gt lt property name address column ADDRESS type string gt lt many to one name organization column ORGANIZATION_ID class Organization gt lt bag name orders inverse true lazy false cascade all gt lt key column CUSTOMER_ID gt lt one to many class Order gt lt bag gt lt class gt lt hibernate mapping Even though associations are declared using target class names the target type of associations can also be a dynamic entity instead of aPOJO After setting the default entity mode to dynamic map for the SessionFactory you can at runtime work with Maps of Maps Session s openSession Transaction tx s beginTransaction Create a customer Map david new HashMap david put name David Create an organization Map foobar new HashMap Foobar put name Foobar Inc Wi Eins both david put organization foobar Save both s save Customer david s save Organization foobar tx commit SMELOSE rE One of the main advantages of dynamic mapping is quick turnaround time for prototyping without the need for entity clas
68. in the SQL query and not in the memory lt set name aliases table person_aliases order by lower name asc gt 115 Kapitel 6 Collection mapping lt key column person gt lt element column name type string gt lt set gt lt map name holidays order by hol_date hol_name gt lt key column year_id gt lt map key column hol_name type string gt lt element column hol_date type date gt lt map gt Note The value of the order by attribute is an SQL ordering not an HQL ordering Associations can even be sorted by arbitrary criteria at runtime using a collection filter sortedUsers s createFilter group getUsers order by this name list 6 3 2 Bidirektionale Assoziationen Eine bidirektionale Assoziation erlaubt die Navigation von beiden Enden der Assoziation Es werden zwei Arten bidirektionaler Assoziationen unterst tzt One to Many set or bag valued at one end and single valued at the other Many to Many an beiden Enden Set oder Bag wertig You can specify a bidirectional many to many association by mapping two many to many associations to the same database table and declaring one end as inverse You cannot select an indexed collection Here is an example of a bidirectional many to many association that illustrates how each category can have many items and each item can be in many categories lt class name Category gt lt id name id col
69. in the where clause will be translated to its discriminator value 216 Ausdr cke from Cat cat where cat class DomesticCat You can also use components or composite user types or properties of said component types See Abschnitt 15 17 Komponenten for more information An any type has the special properties id and class that allows you to express a join in the following way where AuditLog item is a property mapped with lt any gt from AuditLog log Payment payment where log item class Payment and log item id payment id The log item class and payment class would refer to the values of completely different database columns in the above query 15 10 Ausdrucke Expressions used in the where clause include the following e mathematical operators binary comparison operators gt lt lt gt like e logische Vorg nge and or not Parentheses that indicates grouping in not in between is null is not null is empty is not empty member of and not member of e Einfacher Fall case when then else end und gesuchter Fall case when then ves else end e String Verkettung oder concat e current_date current_time and current_timestamp second minute hour day month and year Jede Funktion oder Operator definiert durch EJB QL 3 0 substring trim lower upper len
70. index bar_idx length 30 gt lt column name first not null true index bar_idx length 20 gt lt column name initial gt lt property gt 282 Anpassung des Schemas The default attribute allows you to specify a default value for a column You should assign the same value to the mapped property before saving a new instance of the mapped class lt property name credits type integer insert false gt lt column name credits default 10 gt lt property gt lt version name version type integer insert false gt lt column name version default 0 gt lt property gt Das sql type Attribut erm glicht die AuBerkraftsetzung des Standard Mappings eines Hibernate Typs zum SQL Datentyp lt property name balance type float gt lt column name balance sql type decimal 13 3 gt lt property gt Das check Attribut erm glicht es Ihnen eine Pr fungsbedingung festzulegen lt property name foo type integer gt lt column name foo check foo SOS lt property gt lt class name Foo table foos check bar lt 100 0 gt lt property name bar type float gt lt class gt The following table summarizes these optional attributes Tabelle 21 1 Zusammenfassung Attribut Werte Bedeutung length Zahl Spaltenl nge precision Zahl Dezimale Genauigkeit der Spalte scale Zahl Dezimale Skalierung der Spalte 283 Kapitel 21 Tools
71. invalid assumptions in user code on_close uses ConnectionReleaseMode ON_CLOSE This setting is left for backwards compatibility but its use is discouraged after_transaction uses ConnectionReleaseMode AFTER_TRANSACTION This setting should not be used in JTA environments Also note that with ConnectionReleaseMode AFTER_TRANSACTION if a session is considered to be in auto commit mode connections will be released as ifthe release mode were AFTER_STATEMENT 194 Connection release modes e after_statement uses ConnectionReleaseMode AFTER_STATEMENT Additionally the configured ConnectionProvider is consulted to see if it supports this setting supportsAggressiveRelease If not the release mode is reset to ConnectionReleaseMode AFTER_TRANSACTION This setting is only safe in environments where we can either re acquire the same underlying JDBC connection each time you make a call into ConnectionProvider getConnection or in auto commit environments where it does not matter if we re establish the same connection 195 196 Interzeptoren und Ereignisse It is useful for the application to react to certain events that occur inside Hibernate This allows for the implementation of generic functionality and the extension of Hibernate functionality 13 1 Interzeptoren The Interceptor interface provides callbacks from the session to the application allowing the application to inspect and or manipulate properties o
72. is read only Hibernate does not dirty check simple properties Hibernate will not synchronize simple property state changes to the database If you have automatic versioning Hibernate will not increment the version if any simple properties change Session session factory openSession Transaction tx session beginTransaction get a contract and make it read only Contract contract Contract session setReadOnly contract true contract getCustomerName is Sherman session get Contract class contractId 176 Unidirectional associations contract setCustomerName Yogi tx commit tx session beginTransaction contract Contract session get Contract class contractId contract getCustomerName is still Sherman tx commit session close 11 2 2 Unidirectional associations 11 2 2 1 Unidirectional one to one and many to one Hibernate treats unidirectional one to one and many to one associations in the same way when the owning entity is read only We use the term unidirectional single ended association when referring to functionality that is common to unidirectional one to one and many to one associations Hibernate does not dirty check unidirectional single ended associations when the owning entity is read only If you change a read only entity s reference to a unidirectional single ended association to null or to refer to a different entity that change wi
73. ke 134 7 6 Komplexere ASSOZiatiONS MappingS ceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeaeeeeeaaaees 134 8 Komponenten Mapping 4444444HHHnnnnnn nen eeeeee cae eeeeaaeeeeeaaeeeeeeaaaeeeeeaaeeeees 137 HIBERNATE Relational Persis 8 1 Abh ngige Objekte 22 em beennn 137 8 2 Collections abh ngiger Objekte uuuunnnnssssnnenennnnnnnnnnnnnnen nn nnnnnnnnnnnnen nn 139 8 3 Komponenten als Map Indizes 00 ee cece nee cree ae ee reer eae eres sae eeeeaaaeeeeeaaeeeees 140 8 4 Komponenten als zusammengesetzte Bezeichner ceeeeeeeeeeeeeeeneeeeeeeeees 140 8 5 Dynamische Komponenten uuussssssssnnenennnnnnnnnnnnnnnennnnnnnnnnnnnnnennnnnnnnannnnnenn 143 9 Inheritance mapping ee ENEAS aawonced tagpecdsauevecen taneees 145 9 1 The three Strategies ee 145 9 1 1 Tabelle pro Klasse Hierarchie 4usnnnnnnnnnnenenennnnnnnnnnnnnene nn 145 9 1 2 Tabelle pro Subklasse 222unu0snsannnnannannennnnnnnnnnnnnnnennnnnnnnnnnnannenn 146 9 1 3 Table per subclass using a discriminator 0 0 ee eee eee een nee nnnn nenn 147 9 1 4 Das Mischen der Tabelle pro Klasse Hierarchie mit Tabelle pro SUbKl sse u nd aa eee ae ea 147 9 1 5 Tabelle pro konkrete Klasse 22244440msnnnnnnnnnnnnnennnnnnnnnnnnnnen nn 148 9 1 6 Table per concrete class using implicit polymorphism 149 9 1 7 Das M
74. long setld_id long setld_id long setld_id long getAuthorsd Set getWorksd Set getNamed String setAuthorstemployees Set setWorkslemployers Set setName name String getTitled String getPersond Person setTitle_title String setPersoniperson Person getAliasd String setAlias_alias String tempo float getGenred String setGenrei_genre String getTempod float setTempoltempo float getTextd int setText_text int Das folgende Mapping Dokument repr sentiert diese Beziehungen auf korrekte Weise lt hibernate mapping gt lt class name Work table works discriminator value W gt lt id name id column id gt lt generator class native gt dS lt discriminator column type type character gt lt property name title gt lt set name authors table author_work gt lt key column name work_id gt lt many to many class Author column name author_id gt lt set gt 305 Kapitel 24 Beispiel Verschi lt subclass name Book discriminator value B gt lt property name text gt lt subclass gt lt subclass name Song discriminator value S gt lt property name tempo gt lt property name genre gt lt subclass gt lt class gt lt class name Author table authors gt lt id name id column id gt lt The Author must have the same identifier as the Person gt lt generator class assigned
75. lt column name customerId gt lt many to one 141 Kapitel 8 Komponenten Mapping Tipp The column element is an alternative to the column attribute everywhere Using the column element just gives more declaration options which are mostly useful when utilizing hbm2dd1 Eine many to many Assoziation ZU OrderLine verwendet ebenfalls den zusammengeseizten Fremdschl ssel lt set name undeliveredOrderLines gt lt key column name warehouseld gt lt many to many class OrderLine gt lt column name lineId gt lt column name orderId gt lt column name customerId gt lt many to many gt lt set gt The collection of orderLines in Order would use lt set name orderLines inverse true gt lt key gt lt column name orderId gt lt column name customerId gt lt key gt lt one to many class OrderLine gt lt set gt The lt one to many gt element declares no columns Falls OrderLine selbst eine Collection besitzt so besitzt es auch einen zusammengesetzten Fremdschl ssel lt class name OrderLine gt lt list name deliveryAttempts gt lt key gt lt a collection inherits the composite key type gt lt column name lineld gt lt column name orderId gt lt column name customerId gt lt key gt lt list index column attemptId base 1 gt lt composite element class DeliveryAttempt gt 142 Dynamische Komponenten
76. lt column name table_name gt lt column name id gt lt any gt lt any lt any name propertyName id type idtypename meta type metatypename cascade cascade_style access field property ClassName optimistic lock true false lt meta value gt lt meta value gt aolen goon NS zeolinn ne class Animal gt class Human gt class Alien gt 20209999 95 Kapitel 5 Grundlagen des O R name Der Property Name id type Der Bezeichnertyp meta type optional defaults to string any type that is allowed for a discriminator mapping cascade optional die Standardeinstellung lautet none der Cascade Style Weitergabestil access optional defaults to property the strategy Hibernate uses for accessing the property value 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 O O 8 808 5 2 Hibernate types 5 2 1 Entities und Werte In relation to the persistence service Java language level objects are classified into two groups An 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
77. name F createCriteria kittens add Restrictions like name F ASEO The second createCriteria returns a new instance of Criteria that refers to the elements of the kittens collection There is also an alternate form that is useful in certain circumstances List cats sess createCriteria Cat class createAlias kittens kt createAlias mate mt add Restrictions eqProperty kt name mt name aust createAlias erstellt keine neue Instanz von criteria The kittens collections held by the cat instances returned by the previous two queries are not pre filtered by the criteria If you want to retrieve just the kittens that match the criteria you must use a ResultTransformer List cats sess createCriteria Cat class createCriteria kittens kt add Restrictions eq name F setResultTransformer Criteria ALIAS_TO_ENTITY_MAP RES ERW Iterator iter cats iterator while iter hasNext Map map Map iter next Cat cat Cat map get Criteria ROOT_ALIAS Cat kitten Cat map get kt Additionally you may manipulate the result set using a left outer join List cats session createCriteria Cat class createAlias mate mt Criteria LEFT_JOIN Restrictions like mt name good addOrder Order asc mt age 231 Kapitel 16 Criteria Queries std This will return all of the cats with a mate whose name starts wit
78. name id gt lt generator class increment gt lt id gt lt property name name not null true gt lt soal insert gt INSERT INTO PERSON NAME ID VALUES UPPER lt sql insert gt lt sql update gt UPDATE PERSON SET NAME UPPER WHERE ID lt sql update gt ssal delete gt DELETE FROM PERSON WHERE ID lt sql delete gt nelass gt The SQL is directly executed in your database so you can use any dialect you like This will reduce the portability of your mapping if you use database specific SQL Gespeicherte Prozeduren werden unterst tzt wenn das callable Attribut wie folgt eingestellt ist lt class name Person gt 246 Angepasste SQL f r das Laden lt id name id gt lt generator class increment gt lt id gt lt property name name not null true gt lt sql insert callable true gt call createPerson lt sql insert gt lt sql delete callable true gt call deletePerson lt sql delete gt lt sql update callable true gt call updatePerson lt sql update gt lt class gt The order ofthe positional parameters is vital as they must be in the same sequence as Hibernate expects them You can view the expected order by enabling debug logging for the org hibernate persister entity level With this level enabled Hibernate will print out the static SQL that is used to create update delete etc entities To view the expected sequence do
79. name id gt lt generator class sequence gt lt id gt lt property name name gt lt class gt lt hibernate mapping gt On the other hand if a child has multiple parents a many to many association is appropriate lt hibernate mapping gt lt class name Parent gt lt id name id gt lt generator class sequence gt lt a gt lt set name children table childset gt lt key column parent_id gt lt many to many class Child column child_id gt lt set gt lt class gt lt class name Child gt lt id name id gt lt generator class sequence gt lt 1 id lt property name name gt lt class gt lt hibernate mapping gt Tabellendefinitionen create table parent id bigint not null primary key 122 Collection Beispiele create table child id bigint not null primary key name varchar 255 create table childset parent_id bigint not null ehmlieErasbigintsnot nung primary key parent_id child_id alter table childset add constraint childsetfk0 parent_id references parent alter table childset add constraint childsetfkl child_id references child For more examples and a complete explanation of a parent child relationship mapping see Kapitel 22 Beispiel Parent Child for more information Even more complex association mappings are covered in the next chapter 123 124 Assoziations Mappings 7 1 Einf hrung
80. newly instantiated and which represent existing rows in the database We will also assume that both Parent and Child have generated identifier properties of type Long Hibernate will use the identifier and version timestamp property value to determine which of the children are new See Abschnitt 10 7 Automatische Statuserkennung In Hibernate3 it is no longer necessary to specify an unsaved value explicitly The following code will update parent and child and insert newChild 292 Zusammenfassung parent and child were both loaded in a previous session parent addChild child Child newChild new Child parent addChild newChild session update parent session flush This may be suitable for the case of a generated identifier but what about assigned identifiers and composite identifiers This is more difficult since Hibernate cannot use the identifier property to distinguish between a newly instantiated object with an identifier assigned by the user and an object loaded in a previous session In this case Hibernate will either use the timestamp or version property or will actually query the second level cache or worst case the database to see if the row exists 22 5 Zusammenfassung The sections we have just covered can be a bit confusing However in practice it all works out nicely Most Hibernate applications use the parent child pattern in many places We mentioned an alternative in the first
81. not include your custom SQL in the mapping files as this will override the Hibernate generated static SQL The stored procedures are in most cases required to return the number of rows inserted updated and deleted as Hibernate has some runtime checks for the success of the statement Hibernate always registers the first statement parameter as a numeric output parameter for the CUD operations CREATE OR REPLACE FUNCTION updatePerson uid IN NUMBER uname IN VARCHAR2 RETURN NUMBER IS BEGIN update PERSON set NAME uname where ID uid return SOLSROWCOUNT END updatePerson 17 4 Angepasste SQL f r das Laden You can also declare your own SQL or HQL queries for entity loading As with inserts updates and deletes this can be done at the individual column level as described in Abschnitt 5 7 Column read and write expressions or at the statement level Here is an example of a statement level override lt sql query name person gt 247 Kapitel 17 Native SQL lt return alias pers class Person lock mode upgrade gt SELECT NAME AS pers name ID AS pers id FROM PERSON WHERE ID FOR UPDATE lt sql query gt This is just anamed query declaration as discussed earlier You can reference this named query in a class mapping lt class name Person gt lt id name id gt lt generator class increment gt lt id gt lt property name name not null true gt lt loader query
82. of all elements and attributes and to view the defaults as well as some comments Hibernate will not load the DTD file from the web but first look it up from the classpath of the application The DTD file is included in hibernate core jar it is also included in the hibernate3 jar if using the distribution bundle 7 Wichtig We will omit the DTD declaration in future examples to shorten the code It is of course not optional Between the two hibernate mapping tags include a class element All persistent entity classes again there might be dependent classes later on which are not first class entities need a mapping to a table in the SQL database lt hibernate mapping package org hibernate tutorial domain gt lt class name Event table EVENTS gt lt class gt lt hibernate mapping gt So far we have told Hibernate how to persist and load object of class Event to the table EVENTS Each instance is now represented by a row in that table Now we can continue by mapping the unique identifier property to the tables primary key As we do not want to care about handling this identifier we configure Hibernate s identifier generation strategy for a surrogate primary key column lt hibernate mapping package org hibernate tutorial domain gt lt class name Event table EVENTS gt lt id name id column EVENT_ID gt lt generator class native gt zfid gt lt class gt lt hibernate ma
83. on a join table The inverse true can go on either end of the association on the collection or on the join lt class name Person gt lt id name id column personId gt lt generator class native gt Ard lt set name addresses table PersonAddress gt lt key column personId gt lt many to many column addressId unique true class Address gt lt set gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt join table PersonAddress inverse true optional true gt lt key column addressId gt lt many to one name person column personId 132 One to One not null true gt lt join gt lt class gt create table Person personId bigint not null primary key create table PersonAddress personId bigint not null addressId bigint not null primary key create table Address addressId bigint not null primary key 7 5 2 One to One A bidirectional one to one association on a join table is possible but extremely unusual lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt join table PersonAddress optional true gt lt key column personId unique true gt lt many to one name address column addressId not null true unique true gt lt join gt lt class gt lt class name Address gt
84. order of the Map Set or bag together with an optional asc or desc where optional specifies an arbitrary SQL wHERE condition that is used when retrieving or removing the collection This is useful if the collection needs to contain only a subset of the available data fetch optional defaults to select chooses between outer join fetching fetching by sequential select and fetching by sequential subselect batch size optional defaults to 1 specifies a batch size for lazily fetching instances of this collection access optional defaults to property the strategy Hibernate uses for accessing the collection property value optimistic lock optional defaults to true specifies that changes to the state of the collection results in increments of the owning entity s version For one to many associations you may want to disable this setting mutable optional defaults to true a value of false specifies that the elements of the collection never change This allows for minor performance optimization in some cases 109 Kapitel 6 Collection mapping 6 2 1 Collection Fremdschl ssel Collection instances are distinguished in the database by the foreign key of the entity that owns the collection This foreign key is referred to as the collection key column or columns of the collection table The collection key column is mapped by the lt key gt element There can be a nullability constraint on the foreig
85. paragraph None of the above issues exist in the case of lt composite element gt mappings which have exactly the semantics of a parent child relationship Unfortunately there are two big limitations with composite element classes composite elements cannot own collections and they should not be the child of any entity other than the unique parent 293 294 Beispiel Web Log Anwendung 23 1 Persistente Klassen The persistent classes here represent a weblog and an item posted in a weblog They are to be modelled as a standard parent child relationship but we will use an ordered bag instead of a set package eg import java util List public class Blog private Long _id private String _name private List _items public Long getId return _id public List getItens return _itens public String getName return _name public void setId Long longl i0 longl public void setTIrens Liste list _items list public void setName String string _name string package eg import java text DateFormat import java util Calendar public class BlogItem private Long _id private Calendar _datetime private String _text private String title private Blog _blog public Blog getBlog return _blog public Calendar getDatetime 295 Kapitel 23 Beispiel Web Log return _datetime public Long getId return _id public Strin
86. permissions fetch join gt lt key column userId gt lt one to many class Permission gt lt set lt many to one name mother class Cat fetch join gt Die im Mapping Dokument definierte fet ch Strategie hat Auswirkungen auf Abruf mittels get oder load einem impliziten Abruf der beim Navigieren der Assoziation erfolgt Criteria Anfragen HQL Anfragen wenn subselect Abruf verwendet wird Irrespective of the fetching strategy you use the defined non lazy graph is guaranteed to be loaded into memory This might however result in several immediate selects being used to execute a particular HQL query Usually the mapping document is not used to customize fetching Instead we keep the default behavior and override it for a particular transaction using left join fetch in HQL This tells Hibernate to fetch the association eagerly in the first select using an outer join In the criteria query API you would use set Fet chMode FetchMode JOIN If you want to change the fetching strategy used by get Of load you Can use a Criteria query For example User user User session createCriteria User class setFetchMode permissions FetchMode JOIN add Restrictions idEq userId uniqueResult This is Hibernate s equivalent of what some ORM solutions call a fetch plan A completely different approach to problems with N 1 selects is to use the second level cache 20 1 3 Einendi
87. portability This could mean an internal IT user migrating from one database vendor to another or it could mean a framework or deployable application consuming Hibernate to simultaneously target multiple database products by their users Regardless of the exact scenario the basic idea is that you want Hibernate to help you run against any number of databases without changes to your code and ideally without any changes to the mapping metadata 26 2 Dialekt The first line of portability for Hibernate is the dialect which is a specialization of the org hibernate dialect Dialect contract A dialect encapsulates all the differences in how Hibernate must communicate with a particular database to accomplish some task like getting a sequence value or structuring a SELECT query Hibernate bundles a wide range of dialects for many of the most popular databases If you find that your particular database is not among them it is not terribly difficult to write your own 26 3 Dialect resolution Originally Hibernate would always require that users specify which dialect to use In the case of users looking to simultaneously target multiple databases with their build that was problematic Generally this required their users to configure the Hibernate dialect or defining their own method of setting that value Starting with version 3 2 Hibernate introduced the notion of automatically detecting the dialect to use based on the java sql DatabaseMetaData obtai
88. property can only be referenced by its defined named Otherwise the special id property can be used to reference the identifier property Wichtig Please note that starting in version 3 2 2 this has changed significantly In previous versions id always referred to the identifier property regardless of its actual name A ramification of that decision was that non identifier properties named id could never be referenced in Hibernate queries 15 6 Die select Klausel The select clause picks which objects and properties to return in the query result set Consider the following select mate from Cat as cat inner join cat mate as mate The query will select mates of other cats You can express this query more compactly as select cat mate from Cat cat 212 Die select Klausel Queries can return properties of any value type including properties of component type select cat name from DomesticCat cat where cat name like fri select cust name firstName from Customer as cust Queries can return multiple objects and or properties as an array of type Object select mother offspr mate name from DomesticCat as mother inner join mother mate as mate left outer join mother kittens as offspr Or as a List select new list mother offspr mate name from DomesticCat as mother inner join mother mate as mate left outer join mother kittens as offspr Or assuming that the class Family has an appropriate co
89. property ref propertyNameFromAssociatedClass node element name embed xml true false gt column optional the name of the element foreign key column formula optional an SQL formula used to evaluate the element foreign key value class required the name of the associated class 909909 fetch optional defaults to join enables outer join or sequential select fetching for this association This is a special case for full eager fetching in a single SELECT of an entity and its many to many relationships to other entities you would enable join fetching not only of the collection itself but also with this attribute on the lt many to many gt nested element unique optional enables the DDL generation of a unique constraint for the foreign key column This makes the association multiplicity effectively one to many 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 ent ity name optional the entity name of the associated class as an alternative to class 8 property ref optional the name of a property ofthe associated class that is joined to this foreign key If not specified the primary key ofthe associated class is used 112 Collections von Werten und Many to Many Assoziationen Here are some examples A set of strings lt set name names table person_na
90. 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 82 Many to one 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 iD entity name optional the entity name of the associated class formula optional Ein SQL Ausdruck der den Wert f r einen errechneten Fremdschl ssel definiert Setting a value of the 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 Abschnitt 10 11 Transitive Persistenz for a full explanation Note that single valued many to one and one to one associations do not support orphan delete Here is an example of a typical many to one declaration lt many to one name product class Product column PRODUCT_ID gt The property ref attribute should only be used for mapping legacy data where a foreign key refers to a un
91. r einen zusammengesetzten Schl ssel lt class gt lt class name Lineltem gt lt composite id name id class LineItem Id gt lt key property name customerId length 10 gt lt key property name orderNumber gt lt key property name productId length 10 gt lt composite id gt lt property name quantity gt lt many to one name order insert false update false not null true gt lt column name customerId gt lt column name orderNumber gt lt many to one gt lt many to one name product insert false update false not null true column productId gt lt class gt lt class name Product gt lt synchronize table LineItem gt lt id name productId length 10 gt lt generator class assigned gt lt id gt lt property name description not null true length 200 gt lt property name price length 3 gt lt property name numberAvailable gt lt property name numberOrdered gt lt formula gt select sum li quantity from Lineltem li where li productId productId lt formula gt lt property gt lt class 311 Kapitel 24 Beispiel Verschi 24 4 3 Many to Many mit geteiltem Attribut des zusammengesetzten Schlussels lt class name User table User gt lt composite id gt lt key property name name gt lt key property name org gt lt composite id gt lt set name groups table U
92. resultset mapping information in your hbm files directly in java code List cats sess createSQLQuery select cat kitten from cats cat cats kitten where kitten mother cat id setResultSetMapping catAndKitten alise e 243 Kapitel 17 Native SQL 17 2 1 Die Verwendung der Return Property zur expliziten Spezifizierung von Spalten Aliasnamen You can explicitly tell Hibernate what column aliases to use with lt return property gt instead of using the syntax to let Hibernate inject its own aliases For example lt sql query name mySqlQuery gt lt return alias person class eg Person gt lt return property name name column myName gt lt return property name age column myAge gt lt return property name sex column mySex gt lt return gt SELECT person NAME AS myName person AGE AS myAge person SEX AS mySex FROM PERSON person WHERE person NAME LIKE name lt sql query gt lt return property gt also works with multiple columns This solves a limitation with the syntax which cannot allow fine grained control of multi column properties lt sql query name organizationCurrentEmployments gt lt return alias emp class Employment gt lt return property name salary gt lt return column name VALUE gt lt return column name CURRENCY gt lt return property gt lt return property name endDate column myEndDate gt lt return gt SELECT EMPLOYEE AS emp em
93. semantic In fact sequences are exactly what Hibernate tries to emulate with its table based generators This generator has a number of configuration parameters sequence_name optional defaults to hibernate_sequence the name of the sequence or table to be used 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 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 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 value_column optional defaults to next_va1 only relevant for table structures it is the name of the column on the table which is used to hold the value optimizer optional defaults to none See Abschnitt 5 1 6 Identifier generator optimization 6 The second of these new generators is 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 pluggab
94. sequence gt lt id gt ST zotcher properties gt lt class gt lt hibernate mapping gt public class CustomMapTuplizerImpl extends org hibernate tuple entity DynamicMapEntityTuplizer override the buildInstantiator method to plug in our custom map protected final Instantiator buildInstantiator org hibernate mapping PersistentClass mappingInfo return new CustomMapInstantiator mappingInfo private static final class CustomMapInstantiator extends org hibernate tuple DynamicMapInstantitor override the generateMap method to return our custom map protected final Map generateMap return new CustomMap 4 6 EntityNameResolvers The org hibernate EntityNameResolver interface is a contract for resolving the entity name of a given entity instance The interface defines a single method resolveEntityName which is passed the entity instance and is expected to return the appropriate entity name null is allowed and would indicate that the resolver does not know how to resolve the entity name of the given entity instance Generally speaking an org hibernate EntityNameResolver is going to be most useful in the case of dynamic models One example might be using proxied interfaces as your domain model The hibernate test suite has an example of this exact style of usage under the org hibernate test dynamicentity tuplizer2 Here is some of the code from that package for illustration A very triv
95. the Dialect If a specific type is not mapped or does not result in the expected type it is possible to customize it via calls to registerHibernateType in the Dialect 17 1 2 Entity Anfragen Die Anfragen oben behandeln die erhaltenen Skalarwerte wobei es sich dabei um die unbearbeiteten Werte von resultset handelt Nachfolgend sehen Sie wie Sie Entity Objekte von einer nativen SQL Anfrage mittels addEntity erhalten sess createSQLQuery SELECT FROM CATS addEntity Cat class sess createSQLQuery SELECT ID NAME BIRTHDATE FROM CATS addEntity Cat class Diese Anfrage spezifiziert den SQL Anfragen String die von der Anfrage wiedergegebene Entity Geht man davon aus dass Cat als Klasse mit den Spalten ID NAME und BIRTHDATE gemappt ist werden die Anfragen oben beide mit einer Liste antworten in der jedes Element eine Entity von Cat ist Falls die Entity mit many to one zu einer anderen Entity gemappt ist so ist dies ebenfalls erforderlich wenn die native Anfrage durchgef hrt wird da sonst eine Datenbank spezifische Spalte nicht gefunden Fehlermeldung column not found erscheint Die zus tzlichen Spalten werden bei Verwendung der Notation automatisch wiedergegeben aber wie im folgenden Beispiel f r eine many to one ZU Dog wollen wir lieber explizit sein sess createSQLQuery SELECT ID NAME BIRTHDATE DOG_ID FROM CATS addEntity Cat class Dies erm glicht die ordnungsgem e Funktion
96. the name of the foreign key column This can also be specified by nested lt column gt element s on delete optional defaults to noact ion specifies whether the foreign key constraint has database level cascade delete enabled 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 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 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 unique optional specifies that the foreign key should have a unique constraint This is implied whenever the foreign key is also the primary key For systems where delete performance is important we recommend that all keys should be defined 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 The 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 lt key not null true gt
97. to connections provided through a configured connect ionProvider User supplied connections are outside the breadth of this discussion The different release modes are identified by the enumerated values of org hibernate ConnectionReleaseMode ON_CLOSE Is the legacy behavior described above The Hibernate session obtains a connection when it first needs to perform some JDBC access and maintains that connection until the session is closed AFTER_TRANSACTION releases connections after a org hibernate Transaction has been completed AFTER_STATEMENT also referred to as aggressive release releases connections after every statement execution This aggressive releasing is skipped if that statement leaves open resources associated with the given session Currently the only situation where this occurs is through the use of org hibernate ScrollableResults The configuration parameter hibernate connection release_mode is used to specify which release mode to use The possible values are as follows auto the default this choice delegates to the release mode returned by the org hibernate transaction TransactionFactory getDefaultReleaseMode method For JTATransactionFactory this returns ConnectionReleaseMode AFTER_STATEMENT for JDBCTransactionFactory this returns ConnectionReleaseMode AFTER_TRANSACTION Do not change this default behavior as failures due to the value of this setting tend to indicate bugs and or
98. 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 Abschnitt 4 4 Dynamische Modelle and Kapitel 19 XML Mapping for more information check optional an SQL expression used to generate a multi row check constraint for automatic schema generation 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 67 Kapitel 5 Grundlagen des O R to rowid A ROWID is an implementation detail and represents the physical location of a stored tuple E 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 El abstract optional is used to mark abstract superclasses in lt union subclass gt hierarchies It is acceptable for the named persistent class to be an interface You can declare implementing classes of that interface using the lt subclass gt element You can persist any static inner class Specify the class name using the standard form i e e g FooSBar Immutable classes mutable false Cannot be updated or deleted by the application This allows Hibernate to make some minor performance optimizations The opti
99. to set transaction boundaries If you run in an EJB container declarative transaction demarcation with CMT is preferred 3 8 4 JMX Deployment The line cfg buildSessionFactory still has to be executed somewhere to get a SessionFactory into JNDI You can do this either in a static initializer block like the one in HibernateUtil or you can deploy Hibernate as a managed service Hibernate is distributed with org hibernate jmx HibernateService for deployment on an application server with JMX capabilities such as JBoss AS The actual deployment and configuration is vendor specific Here is an example jboss service xml for JBoss 4 0 x lt xml version 1 0 gt sserver gt lt mbean code org hibernate jmx HibernateService name jboss jca service HibernateFactory name HibernateFactory gt lt i Reqgquired services gt lt depends gt jboss jca service RARDeployer lt depends gt 50 JMX Deployment lt depends gt jboss jca service LocalTxCM name HsqlDS lt depends gt lt Bind the Hibernate service to JNDI gt lt attribute name JndiName gt java hibernate SessionFactory lt attribute gt Sr DataSource Settings lt attribute name Datasource gt java HsqlDS lt attribute gt lt attribute name Dialect gt org hibernate dialect HSOLDialect lt attribute gt SU Transaction integtation gt lt attribute name TransactionStrategy gt org hibernate transaction JTATransactionFact
100. type not null true gt zn lass gt 314 Optimale Verfahren Write fine grained classes and map them using lt component gt Verwenden Sie eine Address Klasse UM street suburb state postcode einzukapseln Das unterst tzt die Wiederverwendung des Code und vereinfacht die Erh hung der Bedienerfreundlichkeit Declare identifier properties on persistent classes Hibernate makes identifier properties optional There are a range of reasons why you should use them We recommend that identifiers be synthetic that is generated with no business meaning Identify natural keys Bestimmen Sie nat rliche Schl ssel f r alle Entities und mappen Sie diese mittels lt natural id gt Implementieren Sie equals und hashCode um die Properties aus denen der nat rliche Schl ssel besteht zu vergleichen Place each class mapping in its own file Do not use a single monolithic mapping document Map com eg Foo in the file com eg Foo hbm xml This makes sense particularly in a team environment Load mappings as resources Deployen Sie die Mappings gemeinsam mit den Klassen die sie mappen Consider externalizing query strings This is recommended if your queries call non ANSI standard SQL functions Externalizing the query strings to mapping files will make the application more portable Verwenden Sie bind Variablen As in JDBC always replace non constant values by Do not use string manipulation to bind a non con
101. tz t null txrollback y throw he finally session close return result public Blog getBlogAndAllItens Long blogid throws HibernateException Session session _sessions openSession Transaction tx null Blog blog null try tx session beginTransaction Query q session createQuery rrom Blog as blog T left outer join fetch blog items where blog id blogid i q setParameter blogid blogid blog Blog q uniqueResult tx commit catch HibernateException he IE tx nudi tx rollback iiy throw he finally session close return blog public List listBlogsAndRecentItems Session session _sessions openSession Transaction tx null List result null try minDate tx session beginTransaction Query q session createQuery rrom Bilog 2s Blog inner join bLog items as blogItem where blogItem datetime i Calendar cal Calendar getInstance j throws HibernateException 301 Kapitel 23 Beispiel Web Log cal roll Calendar MONTH false q setCalendar minDate cal result q list tx commit catch HibernateException he if t Znull tx rollbaek throw he finally session close J return result 302 Beispiel Verschiedene Mappings This chapters explores some more complex association mappings 24
102. und Schema Elemente zu bestimmen You can provide rules for automatically generating database identifiers from Java identifiers or for processing logical column and table names given in the mapping file into physical table and column names This feature helps reduce the verbosity ofthe mapping document eliminating repetitive noise TBL_ prefixes for example The default strategy used by Hibernate is quite minimal You can specify a different strategy by calling Configuration setNamingStrategy before adding mappings SessionFactory sf new Configuration setNamingStrategy ImprovedNamingStrategy INSTANCE addFile Item hbm xml addFile Bid hbm xml buildSessionFactory Bei org hibernate cfg ImprovedNamingStrategy handelt es sich um eine eingebaute Strategie die beim Startpunkt einiger Anwendungen von Nutzen sein kann 3 7 XML Konfigurationsdatei Eine andere Konfigurationsm glichkeit ist die Spezifizierung einer vollst ndigen Konfigurationsdatei mit dem Namen hibernate cfg xm1l Diese Datei kann als Ersatz f r die hibernate properties Datei dienen oder falls beide vorhanden sind Properties au er Kraft setzen The XML configuration file is by default expected to be in the root of your CLASSPATH Here is an example lt xml version 1 0 encoding utf 8 gt lt DOCTYPE hibernate configuration PUBLIC _ Hibernate Hibernate Configuration DTD EN 46 XML Konfigurationsdatei http hib
103. und Transaktion u uusussssssseenenennnnnnnnnnnn 181 1211 1 Arbetsenhet sorserien ei a 181 12 1 2 Lange Konversationen uuuss44senennnnnennnnnnnnnnnnnnnnnnnnnnnnnnnn en nnnnnnnnnn 182 12 1 3 Die Ber cksichtigung der Objektidentit t enennnnnnnn 183 12 1 4 G ngige Probleme uus0nnsnnnnnnnenennnnnnnnnnnnnnnnnnnnnnnnnnnn nn 184 12 2 Abgrenzung von Datenbanktransaktionen s44444nnnnnn nennen nnnnnn nn 185 12 2 1 Die nicht gemanagte Umgebung us44senennnnnennnnnnnnnnnnnnnnnnnn nn 186 12 2 2 Die Verwendung von JTA uuussssenennnssnnennnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn 187 12 2 3 Der Umgang mit Ausnahmen u 424244sHnnsnennnnnnnnnnnnnnnnnnnn nn nun 188 12 2 4 Transaktions Timeout u ae 189 12 3 Optimistische Nebenl ufigkeitskontrolle 24444444444nnnnnnnnnnen ee nnnnnenn 190 12 3 1 Kontrolle der Anwendungsversion cceceeeeeeeeeeeeaeeceeeeeeeeeeeeaaaaeeeees 190 12 3 2 Erweiterte Session und automatische Versionierung n 191 12 3 3 Abgesetzte Objekte und automatische Versionierung 192 12 3 4 Anpassung der automatischen Versionierung 244444nn seen nennen 192 12 4 Pessimistic locking cece cece cette cece eee ee eee ee ee eee eeeeeeaaeeeeeeaeeeeeeeaeeeeeaaaeeeesaaees 193 12 5 Connection release modes u4sussnnsnssnnnnennnnnnnnnnnnnnnen
104. union subclass gt mappings under the same root lt class gt element It is possible to mix together the table per hierarchy and table per subclass strategies under the the same lt class gt element by combining the lt subclass gt and lt join gt elements see below for an example It is possible to define subclass union subclass and joined subclass mappings in separate mapping documents directly beneath hibernate mapping This allows you to extend a class hierarchy by adding a new mapping file You must specify an extends attribute in the subclass mapping naming a previously mapped superclass Previously this feature made the ordering of the mapping documents important Since Hibernate3 the ordering of mapping files is irrelevant when using the extends keyword The ordering inside a single mapping file still needs to be defined as superclasses before subclasses lt hibernate mapping gt lt subclass name DomesticCat extends Cat discriminator value D gt lt property name name type string gt lt subclass gt lt hibernate mapping gt 9 1 1 Tabelle pro Klasse Hierarchie Suppose we have an interface Payment with the implementors creditCardPayment CashPayment and ChequePayment The table per hierarchy mapping would display in the following way 145 Kapitel 9 Inheritance mapping lt class name Payment table PAYMENT gt lt id name id type long column PAYMENT_ID gt lt generator class native
105. usertypes DefaultValueIntegerType name default_zero gt lt param name default gt 0 lt param gt lt typedef gt lt property name priority type default_zero gt Es ist auch m glich die in einer typedef bereitgestellten Parameter von Fall zu Fall unter Verwendung der Typ Parameter des Property Mappings au er Kraft zu setzen 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 MonetaryAmount Classis 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 5 3 Das mehrfache Mappen einer Klasse It is possible to provide more than one mapping for a particular persistent class In this case you must specify an 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 99 Kapitel 5 Grundlagen des O R when working with persistent objects when writing queries or when mapping associations to the named entity lt class name Contract table 1Contracts entity name CurrentContract gt lt se
106. value CASH class CashPayment gt lt meta value value CHEQUE class ChequePayment gt lt column name PAYMENT_CLASS gt lt column name PAYMENT_ID gt lt any gt 9 1 7 Das Mischen impliziter Polymorphie mit anderen Vererbungsmappings Since the subclasses are each mapped in their own lt class gt element and since Payment is just an interface each of the subclasses could easily be part of another inheritance hierarchy You can still use polymorphic queries against the Payment interface lt class name CreditCardPayment table CREDIT_PAYMENT gt lt id name id type long column CREDIT_PAYMENT_ID gt lt generator class native gt lt ids lt discriminator column CREDIT_CARD type string gt lt property name amount column CREDIT_AMOUNT gt lt subclass name MasterCardPayment discriminator value MDC gt lt subclass name VisaPayment discriminator value VISA gt lt class gt lt class name NonelectronicTransaction table NONELECTRONIC_TXN gt lt id name id type long column TXN_ID gt lt generator class native gt lt id gt lt joined subclass name CashPayment table CASH_PAYMENT gt lt key column PAYMENT_ID gt lt property name amount column CASH_AMOUNT gt lt joined subclass gt lt joined subclass name ChequePayment table CHEQUE_PAYMENT gt lt key column PAYMENT_ID gt lt property name amount column CHEQUE_AMOUNT gt lt join
107. wird zur ckgeschickt die vorgegebene Instanz wird nicht mit der Session assoziiert sie bleibt abgesetzt 10 8 Das L schen persistenter Objekte Session delete will remove an object s state from the database Your application however can still hold a reference to a deleted object It is best to think of delete as making a persistent instance transient sess delete cat 164 Objektreplikation zwischen zwei verschiedenen Datenspeichern You can delete objects in any order without risk of foreign key constraint violations It is still possible to violate a NoT NULL constraint on a foreign key column by deleting objects in the wrong order e g if you delete the parent but forget to delete the children 10 9 Objektreplikation zwischen zwei verschiedenen Datenspeichern It is sometimes useful to be able to take a graph of persistent instances and make them persistent in a different datastore without regenerating identifier values retrieve a cat from one database Session sessionl factoryl openSession Transaction txl sessionl beginTransaction Cat cat sessionl get Cat class catlId txl commit sessionl close reconcile with a second database Session session2 factory2 openSession Transaction tx2 session2 beginTransaction session2 replicate cat ReplicationMode LATEST_VERSION tex 2 eomm amp a r session2 close The ReplicationMode determines how replicate will deal
108. your business methods as having a strict contract with the presentation tier about what data is available in the detached objects This is not a limitation of Hibernate It is a fundamental requirement of safe transactional data access Consider abstracting your business logic from Hibernate Hide Hibernate data access code behind an interface Combine the DAO and Thread Local Session patterns You can even have some classes persisted by handcoded JDBC associated to Hibernate via a UserType This advice is however intended for sufficiently large applications It is not appropriate for an application with five tables Do not use exotic association mappings Practical test cases for real many to many associations are rare Most of the time you need additional information stored in the link table In this case it is much better to use two one to many associations to an intermediate link class In fact most associations are one to many and many to one For this reason you should proceed cautiously when using any other association style Prefer bidirectional associations Unidirektionale Assoziationen sind schwieriger abzufragen In einer groBen Anwendung m ssen fast alle Assoziationen bei Anfragen nach beiden Richtungen navigierbar sein 317 318 Database Portability Considerations 26 1 Portability Basics One of the selling points of Hibernate and really Object Relational Mapping as a whole is the notion of database
109. 20 1 8 Die Verwendung von Lazy Property Fetching 24 nn 269 20 2 Das Cache der zweiten Ebene 424444snnsnnnnnnnnnnnnnnnnnnnnnnnnnnnnenn mann 270 20 2 1 Cache Mappings sssrinin aa iia aa 271 20 2 2 Strategie read only siiis naaa aE 272 20 2 3 Strategie read write nsssennennnnnnnnsnnnnnennnnnnnnnnnnnnen nn nnnnnnnnnnennnnn 272 20 2 4 Strategie nonstrict read write usssssssssnnenenennnnnnnannnnnennnnnnnnnannnn 272 20 2 5 Strategie transaktional nosiris niona naaa aaia 273 20 2 6 Cache provider concurrency strategy compatibility 273 20 3 Management der Caches 4s44424444ennennnnnnnnnnnnnennnnnnnnnnnnnnennnnnnnannnnn 273 20 4 Das Anfragen Cache 4242s44nnnnnennnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nn 275 20 4 1 Enabling query caching 44ss44444nennnnnnennnnnnn EA 275 20 4 2 Query cache regions ussusannnnnnnnnnennnnnnnnnannnnnnnennnnnnnnnnnnnnen ana 276 20 5 Die Perfomance der Collection verstehen c ccccceeeeeeeeeeeeeeeeeeeaeaaeeeeeeeeeees 276 20 9 dS VAXOMONMG een id aeocnevanvenctaiwetes 276 20 5 2 Listen Maps idbags und Sets sind die am effizientesten zu aktualisierenden Collections 0444444444nnnnnnnnnannnnnen en nnnnnnnnnnen nn 277 20 5 3 Bags und Listen sind die effizientesten invertierten Collections 278 20 5 4 One Shot L schu
110. 25 Kapitel 7 Assoziations Mappings lt class name Person gt lt id name id column personlId gt lt generator class native gt lt a gt lt many to one name address column addressId unique true not null true gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt class gt create table Person personId bigint not null primary key addressId bigint not null unique create table Address addressId bigint not null primary key A unidirectional one to one association on a primary key usually uses a special id generator In this example however we have reversed the direction of the association lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt class gt lt class name Address gt lt id name id column personId gt lt generator class foreign gt lt param name property gt person lt param gt lt generator gt lt id gt lt one to one name person constrained true gt lt class gt create table Person personId bigint not null primary key create table Address personId bigint not null primary key 126 One to many 7 2 3 One to many A unidirectional one to many association on a foreign key is an unusual case and is not recommended lt class name Person gt lt id name id column personId
111. 4 4 1 3 Bevorzugung nicht finaler Klassen optional ceeeeeeeeeeeeeeeeeeeeeeeaes 55 4 1 4 Zugriffsberechtigte und Mutatoren f r persistente Felder deklarieren OPHIONAl Aussee ea 55 4 2 Implementierung der Vererbung uus4ssesnnnsnnnnnnnnnn nn ee eeeeaaeeeeeeaaneeeeeaaneeeeeaa 55 4 3 Implementing equals and hashCode uusennsnsnnnnnennnnnnnnnnnnnen nn 56 4 4 Dynamische Modelle 00 cece eee ee cece cece eee ee eee ee ee ee aan ei EE 57 AsO MUPDIZON ass een er een en een 59 4 6 EntilyNamehesolvers un etensenne ee 60 5 Grundlagen des O R Mappings 44444444444nnnsnnnnnnnennnnnnnnnnnnnnennnnnnnnannnnnen 63 5 1 Mapping Deklaration 4444440s04annnnnnnnnnennnnnnnnnnnnnnennnnnnnnnnnnnnnennnannnnnnnn 63 Dell DOEIYPe u e ei 64 5 1 2 Hibernate mapping rerien namen nnannnnennn nen 65 5 1 9 GIASS Ha Hirte ne eine tod ia eateete tats A hdd et 66 VAN shied A E dances i ange E EUSDERUEREHERTEFEUEGEEREEHENUFEREDERE 69 5 1 5 Enhanced identifier generators 4us44444nnnnnnnnennnnnnnnnnnnnnn en nnnnnn nn nnnnnnn 73 5 1 6 Identifier generator optimization uss44444sHnnnn nen nnnnnnennnnnnnennnnnnnenn nn 75 5 1 7 C0mMpPosiIteld ns een 75 5 1 8 Disefiminal r secorir aaa a en ae treuer 77 5 1 9 Version OPlONAl zu ee ee 77 5 1 10 Timestamp optional 0c tees cette eee eee eee eee a tree ee T 78 Dll Ae
112. Count queryCacheMissCount log info Query Hit ratio queryCacheHitRatio EntityStatistics entityStats stats getEntityStatistics Cat class getName long changes entityStats getInsertCount entityStats getUpdateCount entityStats getDeleteCount log info Cat class getName changed changes times You can work on all entities collections queries and region caches by retrieving the list of names of entities collections queries and region caches using the following methods get Queries getEntityNames getCollectionRoleNames and getSecondLevelCacheRegionNanes 280 Toolset Handbuch Roundtrip engineering with Hibernate is possible using a set of Eclipse plugins commandline tools and Ant tasks Hibernate Tools currently include plugins for the Eclipse IDE as well as Ant tasks for reverse engineering of existing databases Mapping Editor an editor for Hibernate XML mapping files that supports auto completion and syntax highlighting It also supports semantic auto completion for class names and property field names making it more versatile than a normal XML editor Console the console is a new view in Eclipse In addition to a tree overview of your console configurations you are also provided with an interactive view of your persistent classes and their relationships The console allows you to execute HQL queries against your database and browse the result direct
113. CustomPersister for a simple example of persistence to a Hashtable The dynamic update and dynamic insert settings are not inherited by subclasses so they can also be specified on the lt subclass gt Or lt joined subclass gt elements Although these settings can increase performance in some cases they can actually decrease performance in others 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 Wenn Sie dynamic update aktivieren haben Sie die Wahl zwischen verschiedenen Strategien f r das optimistische Sperren e version check the version timestamp columns 68 all check all columns e dirty check the changed columns allowing some concurrent updates none do not use optimistic locking It is 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 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 an
114. DBCTransactionFactory delegiert an die Datenbank JDBC Transaktionen default 48 JNDI bound SessionFactory org hibernate transaction JTATransactionFactory delegates to container managed transactions if an existing transaction is underway in this context for example EJB session bean method Otherwise a new transaction is started and bean managed transactions are used org hibernate transaction CMTTransactionFactory delegiert an containerverwaltete JTA Transaktionen You can also define your own transaction strategies for a CORBA transaction service for example Some features in Hibernate i e the second level cache Contextual Sessions with JTA etc require access to the JTA TransactionManager in a managed environment In an application server since J2EE does not standardize a single mechanism you have to specify how Hibernate should obtain a reference to the TransactionManager Tabelle 3 10 JTA TransactionManagers Transaction Factory Applikationsserver org hibernate transaction JBossTransactionManagerLookup JBoss org hibernate transaction WeblogicTransactionManagerLookup Weblogic org hibernate transaction WebSphereTransactionManagerLookup WebSphere org hibernate transaction WebSphereExtendedJTATransact ionLookWWebSphere 6 org hibernate transaction OrionTransactionManagerLookup Orion org hibernate transaction ResinTransactionManagerLookup Resin org hibernate transa
115. HIBERNATE Relational Persistence for Idiomatic Java 1 Hibernate Reference Documentation 3 5 6 Final von Gavin King Christian Bauer Max Rydahl Andersen Emmanuel Bernard und Steve Ebersole and thanks to James Cobb Graphic Design und Cheyenne Weaver Graphic Design VOTWOLE au ee en dew en a re ee xi Ve Tutorial E E E A E a a au E 1 1 1 Teil 1 Die erste Hibernate Anwendung s ssesssssssssrreessrrsssernrresrrnnsennrennnnnneenneennnn 1 Tete SOUP EE E SERERSEHERESEN 1 1 1 2 Die erste Klasse uun0snnennonnnnnnnannnnnnnmnnnnnnnnnnnnnnnannnnnnnannnnnenannnnnenan 3 11 3 Die Mapping Dalol u een 4 1 1 4 Die Konfiguration von Hibernate 442444404nsnnnnnnnnnnnen nn nnnnnnnnnnennnen 7 1 1 5 Building with Maven cece eeceee tees ee ee tree EENE EE TENERNE R 9 1 1 6 Inbetriebnahme und Helfer cece ceceee cece ce eeceeeeeeeeeeeeaeaaeeeeeeeeeeeeaeaaeeees 10 1 1 7 Das Laden und Speichern von Objekten ccccceeeeeeeeeeeeeeeeeaeeeeeeeeeees 11 1 2 Teil 2 Mapping Assoziationen uunnssenennnnnenennnnnnnnnnnnnnnnnnnnnnn anna nnnnnnnnn 14 1 2 1 Das Mappen der Personenklasse u 4444snnnnnennnnnnnennnnnnnennnnnnn nn 14 1 2 2 Eine unidirektionale Set basierte Assoziation 4 4snsnnnnn nennen 15 1 2 3 Das Bearbeiten der Assoziation usssss44ennsnnnen nennen nnnnnnennnnnnn nn 16 1 2 4 Collection von Werten
116. List of Object arrays Object with scalar values for each column in the CATS table Hibernate will use ResultSetMetadata to deduce the actual order and types of the returned scalar values To avoid the overhead of using ResultSetMetadata or simply to be more explicit in what is returned one can use addScalar sess createSQLQuery SELECT FROM CATS addScalar ID Hibernate LONG addScalar NAME Hibernate STRING addScalar BIRTHDATE Hibernate DATE Diese Anfrage spezifiziert den SQL Anfragen String die wiederzugebenden Spalten und Typen This will return Object arrays but now it will not use ResultSetMetadata but will instead explicitly get the ID NAME and BIRTHDATE column as respectively a Long String and a Short from the underlying resultset This also means that only these three columns will be returned even though the query is using and could return more than the three listed columns 237 Kapitel 17 Native SQL Es ist m glich die Typeninformationen f r alle oder einige der Skalare auszulassen sess createSQLQuery SELECT FROM CATS addScalar ID Hibernate LONG addScalar NAME addScalar BIRTHDATE This is essentially the same query as before but now ResultSetMetaData is used to determine the type of NAME and BIRTHDATE where as the type of ID is explicitly specified How the java sql Types returned from ResultSetMetaData is mapped to Hibernate types is controlled by
117. Many to one 3 Der Name einer serialisierbaren Java Klasse 4 The class name of a custom type com illflow type MyCustomType etc 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 type attribute For example to distinguish between Hibernate DATE and Hibernate TIMESTAMP Or to specify a custom type The 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 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 SELECT clause subquery in the SQL query that loads an instance lt property name totalPrice formula SELECT SUM li quantity p price FROM LineItem li Product p WHERE li productId p productId AND li customerId customerId AND li orderNumber orderNumber gt You can reference the e
118. Metadata and CollectionMetadata interfaces and the Type hierarchy Instances of the metadata interfaces can be obtained from the SessionFactory 168 Die Verwendung von Metadata CotSrrieze spe rel cs B ClassMetadata catMeta sessionfactory getClassMetadata Cat class Object propertyValues catMeta getPropertyValues fritz String propertyNames catMeta getPropertyNames Type propertyTypes catMeta getPropertyTypes get a Map of all properties which are not collections or associations Map namedValues new HashMap for int i 0 i lt propertyNames length i if propertyTypes i isEntityType amp amp propertyTypes i isCollectionType namedValues put propertyNames i propertyValues i 169 170 Read only entities gt Wichtig Hibernate s treatment of read only entities may differ from what you may have encountered elsewhere Incorrect usage may cause unexpected results When an entity is read only Hibernate does not dirty check the entity s simple properties or single ended associations Hibernate will not update simple properties or updatable single ended associations Hibernate will not update the version of the read only entity if only simple properties or single ended updatable associations are changed In some ways Hibernate treats read only entities the same as entities that are not read only Hibernate cascades operations to associat
119. Namen setString userName userName uniqueResult Map permissions u getPermissions t commit smelose Integer accessLevel Integer permissions get accounts Error Since the permissions collection was not initialized when the session was closed the collection will not be able to load its state Hibernate does not support lazy initialization for detached objects This can be fixed by moving the code that reads from the collection to just before the transaction is committed Alternatively you can use a non lazy collection or association by specifying lazy false for the association mapping However it is intended that lazy initialization be used for almost all collections and associations If you define too many non lazy associations in your object model Hibernate will fetch the entire database into memory in every transaction On the other hand you can use join fetching which is non lazy by nature instead of select fetching in a particular transaction We will now explain how to customize the fetching strategy In Hibernate3 the mechanisms for choosing a fetch strategy are identical for single valued associations and collections 20 1 2 Abstimmung von Abrufstrategien Der Auswahlabruf Select Fetching Standard ist extrem anf llig f r N 1 Auswahlprobleme weswegen sich die Aktivierung von Join Fetching im Mapping Dokument empfiehlt 262 Einendige Assoziationsproxies lt set name
120. Null ausgeschlossen Sie k nnen anpassen wie das Example angewendet wird Example example Example create cat 232 Projektionen Aggregation und Gruppierung excludeZeroes exclude zero valued properties excludeProperty color exclude the property named color ignoreCase perform case insensitive string comparisons enableLike use like for string comparisons List results session createCriteria Cat class add example Liest Sie k nnen sogar Beispiele verwenden um Kriterien auf assoziierte Objekte anzuwenden List results session createCriteria Cat class add Example create cat createCriteria mate add Example create cat getMate ERS 16 7 Projektionen Aggregation und Gruppierung The class org hibernate criterion Projections isa factory for Projection instances You can apply a projection to a query by calling setProjection List results session createCriteria Cat class setProjection Projections rowCount add Restrictions eq color Color BLACK Lees List results session createCriteria Cat class setProjection Projections projectionList add Projections rowCount add Projections avg weight add Projections max weight add Projections groupProperty color Listy In einer Criteria Query ist kein explizites gruppieren nach notwendig Bestimmte Projektionstypen sind als Gruppierungsprojektionen defini
121. PAYM ENT_STATUS und If the statusChanges collection was mapped as a list instead of a set the query would have been much simpler to write select count payment status name from Payment as payment join payment currentStatus as status where payment status name lt gt PaymentStatus AWAITING_APPROVAL or payment statusChanges maxIndex payment statusChanges user lt Curren EU Ser group by status name status sortOrder 224 Bulk Aktualisierung und L schen order by status sortOrder Die n chste Anfrage verwendet die MS SQL Server isnull Funktion um alle Konten und unbezahlten Zahlungen f r the Organisation zu der der aktuelle Benutzer geh rt wiederzugeben Sie wird in eine SQL Anfrage mit drei inneren Verb nden inner Joins einen u eren Verbund outer Join und eine Unterauswahl gegen die ACCOUNT PAYMENT PAYMENT_STATUS ACCOUNT_TYPE ORGANIZATION Und ORG_USER Tabellen bersetzt select account payment from Account as account left outer join account payments as payment where currentUser in elements account holder users and PaymentStatus UNPAID isNull payment currentStatus name PaymentStatus UNPAID order by account type sortOrder account accountNumber payment dueDate Bei einigen Datenbanken w rden wir die korrelierende Unterauswahl abschaffen m ssen select account payment from Account as account join account holder users as user left outer join acco
122. PI 16 1 Creating a criteria instance Das Interface org hibernate Criteria reprasentiert eine Anfrage an eine bestimmte persistente Klasse Bei der session handelt es sich um eine Factory f r criteria Instanzen Criteria crit sess createCriteria Cat class crit setMaxResults 50 List cars crit Listiyy 16 2 Den Ergebnissatz eingrenzen Ein individuelles Query Criterion Anfragenkriterium ist eine Instanz des Interface org hibernate criterion Criterion Die Klasse org hibernate criterion Restrictions definiert Factory Methoden um bestimmte eingebaute Criterion Typen einzuholen List cats sess createCriteria Cat class add Restrictions like name Fritz add Restrictions between weight minWeight maxWeight alaise e Restrictions can be grouped logically List cats sess createCriteria Cat class add Restrictions like name Fritz add Restrictions or Restrictions eq age new Integer 0 Restrictions isNull age i sp List cats sess createCriteria Cat class KaddlWReseerieteionsren nane new Streinall Rz I lt i Eplus add Restrictions disjunction add Restrictions isNull age add Restrictions eq age new Integer 0 add Restrictions eq age new Integer 1 add Restrictions eq age new Integer 2 ie PGs ie 229 Kapitel 16 Criteria Queries There are a range of built in criterion types Restrictions subclasses One
123. Person personId bigint not null primary key create table PersonAddress personId bigint not null primary key unique create table Address addressId bigint not null primary key 7 3 4 Many to many addressId bigint not null Finally here is an example of a unidirectional many to many association lt class name Person gt lt id name id column personId gt lt generator class native gt z id gt lt set name addresses table PersonAddress gt lt key column personId gt lt many to many column addressId class Address gt lt set gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt class gt 129 Kapitel 7 Assoziations Mappings create table Person personId bigint not null primary key create table PersonAddress personId bigint not null addressId bigint not null primary key personlId addressId create table Address addressId bigint not null primary key 7 4 Bidirektionale Assoziationen 7 4 1 one to many many to one A bidirectional many to one association is the most common kind of association The following example illustrates the standard parent child relationship lt class name Person gt lt id name id column personId gt lt generator class native gt lt le lt many to one name address column addressId not null true gt lt class gt l
124. Person p left join fetch p events where p id pid setParameter pid personld uniqueResult Eager fetch the collection so we can use it detached Event anEvent Event session load Event class eventId session getTransaction commit Me Enol oE umae CNE come wonsk aPerson getEvents add anEvent aPerson and its collection is detached Begin second unit of work Session session2 HibernateUtil getSessionFactory getCurrentSession session2 beginTransaction session2 update aPerson Reattachment of aPerson session2 getTransaction commit The call to update makes a detached object persistent again by binding it to a new unit of work so any modifications you made to it while detached can be saved to the database This includes any modifications additions deletions you made to a collection of that entity object This is not much use in our example but it is an important concept you can incorporate into your own application Complete this exercise by adding a new action to the main method of the EventManager and call it from the command line If you need the identifiers of a person and an event the save method returns it you might have to modify some of the previous methods to return that identifier else if args 0 equals addpersontoevent Long eventId mgr createAndStoreEvent My Event new Date Long personId mgr createAndStorePerson Foo Bar mgr addPersonToEven
125. Propelty se em 79 5 1 12 M ny o On amp u ae anne uhren 81 5 11 19 One 10 0NO Aare ee nn vakvocartuatidacysavuestene ne eere re 84 5k14 Naturaliid ossoa a ee eeineeeeeian 86 5 1 15 Component and dynamic componert 44snnnnnsnnnnnenennnnnnnnnnnnnnen 86 9 1 16 Properes u na a alles 87 5 1 17 SUbClass 4 42 04 ee Ne nie 88 5 1 18 JOlned subel sS z 4 2 Aistzar anstehen ran haereerden 89 5 1 19 UnION SUBEIASS 1 ann ee ae ie 91 51 20 JOIN unsre ea daran A ASS 91 SZIKES ERESENE re ee Ce E oi et ge O E A E E N 93 5 1 22 Column and formula elements cccceeeeeeeeee cece ae ee eeeeeeeeeeeeaeaaeeeeeeeeeees 93 DEA 2 Se IMPO antenne ae a ae Teer nenne 94 ME AMY ES PRERERSHERNEER PPERSSPERERESPLERPERIEETARRERETEFEBFEEURERESEITERFERRESTERNEPLTPFCEREREFEREEPERERER 95 9 2 Hibern te TYPOS unnennentia aeedebann N i teeedantlvewes 96 5 2 1 Entities und Werte eorr an OaS 96 5 2 2 Grundlegende Wertetypen cccecccceeeeeeeeeeeeeeaaeeeeeeeeeeeeaeaaaaneeeeeeeeeaeaaea 97 5 2 3 Angepasste Wertetypen 2 2uusnnnssennnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnenn nn nenn 98 5 3 Das mehrfache Mappen einer Klasse nnssennnnsnnnennnnnnnennnnnnnnnnnnnnn nn nnnnnnen 99 5 4 SQL angef hrte Bezeichner 4ss44ssnnnnnnnnnnnnennnnnnnnnnnnnnnn nn nnnnnnnnnnnnnnen 100 5 5 Metadata Altennativen 4 un nee ne enden 100 5 5 1 Die Verwendung von XDoclet Markup c eeeee
126. STOMER_ID Set lt Order gt orders Getter setter and business methods Note Support for JDK 5 0 Annotations and JSR 220 is currently under development Please refer to the Hibernate Annotations module for more details 5 6 Generated properties Generated properties are properties that have their values generated by the database Typically Hibernate applications needed to 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 Properties marked as generated must additionally be non insertable and non updateable Only versions timestamps and simple properties can be marked as generated never the default the given property value is not generated within the database 103 Kapitel 5 Grundlagen des O R 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 always the property value is generated both on insert and on update 5 7 Column read and write expressions Hibernate allows you to customi
127. See Abschnitt 20 1 Abrufstrategien for more information from Cat as cat inner join fetch cat mate left join fetch cat kittens A fetch join does not usually need to assign an alias because the associated objects should not be used in the where clause or any other clause The associated objects are also not returned directly in the query results Instead they may be accessed via the parent object The only reason you might need an alias is if you are recursively join fetching a further collection from Cat as cat inner join fetch cat mate left join fetch cat kittens child left join fetch child kittens The fetch construct cannot be used in queries called using iterate though scroll can be used Fetch should be used together with setMaxResults Of setFirstResult as these operations are based on the result rows which usually contain duplicates for eager collection fetching hence the number of rows is not what you would expect Fetch should also not be used together with impromptu with condition It is possible to create a cartesian product by join fetching more than one collection in a query so take care in this case Join fetching multiple collection roles can produce unexpected results for bag mappings so user discretion is advised when formulating queries in this case Finally note that full join fetchand right join fetch are not meaningful If you are using property level lazy fetching with bytecode instrumentatio
128. SessionFactory Hashtable tb new Hashtable lop PU Weypel Wisibeleaksiesety tb put sessionFactory myFinancialApp ObjectName on new ObjectName hibernate tb MBean object name StatisticsService stats new StatisticsService MBean implementation stats setSessionFactory sessionFactory Bind the stats to a SessionFactory server registerMBean stats on Register the Mbean on the server MBean service registration for all SessionFactory s Hashtable tb new Hashtable tbh put type statistresi r tb put Tsessionfactory Tall ObjectName on new ObjectName hibernate tb MBean object name StatisticsService stats new StatisticsService MBean implementation server registerMBean stats on Register the MBean on the server You can activate and deactivate the monitoring for a SessionFactory zum Konfigurationszeitpunkt setzen Sie hibernate generate_statistics auf false zur Runtime sf getStatistics setStatisticsEnabled true oder hibernateStatsBean setStatisticsEnabled true Statistics can be reset programmatically using the clear method A summary can be sent to a logger info level using the logSummary method 20 6 2 Metriken Hibernate provides a number of metrics from basic information to more specialized information that is only relevant in certain scenarios All available counters are described in the Statistics interface API
129. account short desc Credit Card gt 985612323 lt account gt lt name gt lt first name gt Gavin lt first name gt lt initial gt A lt initial gt lt last name gt King lt last name gt lt name gt lt customer gt Wenn Sie die Einstellung embed xm1 true im lt one to many gt Mapping vornehmen so sehen die Daten eher wie folgt aus lt customer id 123456789 gt lt account id 987632567 short desc Savings gt lt customer id 123456789 gt lt balance gt 100 29 lt balance gt lt account gt lt account id 985612323 short desc Credit Card gt lt customer id 123456789 gt lt balance gt 2370 34 lt balance gt lt account gt lt name gt lt first name gt Gavin lt first name gt lt initral gt A lt initial gt lt last name gt King lt last name gt lt name gt lt customer gt 19 3 Manipulation von XML Daten You can also re read and update XML documents in the application You can do this by obtaining a dom4j session Document doc s e Session session factory openSession Session dom4jSession session getSession EntityMode DOM4J Transaction tx session beginTransaction 258 Manipulation von XML Daten List results for dom4jSession createQuery from Customer c left join fetch c accounts where c lastName like PS eine 10 add the customer data to the XML document i lt results size i Element cu
130. ad only entities Hibernate dirty checks bidirectional many to many associations The collection on either side of the association can contain entities that are read only as well as entities that are not read only Entities are added and removed from both sides of the collection changes are flushed to the database If automatic versioning is used Hibernate will update the version due to changes in both sides of the collection if they dirty the entity owning the respective collections 180 Transactions and Concurrency The most important point about Hibernate and concurrency control is that it is easy to understand Hibernate directly uses JDBC connections and JTA resources without adding any additional locking behavior It is recommended that you spend some time with the JDBC ANSI and transaction isolation specification of your database management system Hibernate does not lock objects in memory Your application can expect the behavior as defined by the isolation level of your database transactions Through session which is also a transaction scoped cache Hibernate provides repeatable reads for lookup by identifier and entity queries and not reporting queries that return scalar values In addition to versioning for automatic optimistic concurrency control Hibernate also offers using the SELECT FOR UPDATE syntax a minor API for pessimistic locking of rows Optimistic concurrency control and this API are discussed late
131. alize contract getNotes setDefaultReadOnly false Gx conmit i session close If Session isDefaultReadOnly returns true then you can use Query setReadOnly false and Criteria setReadOnly false to override this session setting and load entities that are not read only 11 1 4 Making a persistent entity read only Anmerkung Persistent entities of immutable classes are automatically made read only 174 Read only affect on property type To make a persistent entity or proxy read only call Session setReadOnly entityOrProxy true To change a read only entity or proxy of a mutable class so it is no longer read only call Session setReadOnly entityOrProxy false Wichtig When a read only entity or proxy is changed so it is no longer read only Hibernate assumes thatthe current state ofthe read only entity is consistent with its database representation If this is not true then any non flushed changes made before or while the entity was read only will be ignored To throw away non flushed changes and make the persistent entity consistent with its database representation call session refresh entity To flush changes made before or while the entity was read only and make the database representation consistent with the current state of the persistent entity evict the read only entity so it is detached session evict entity make the detached entity with the non flushed c
132. alizing proxies 90998 lazy optional defaults to true setting lazy false disables the use of lazy fetching F r diese Mapping Strategie ist keine Diskriminatorspalte oder Schl sselspalte erforderlich For information about inheritance mappings see Kapitel 9 Inheritance mapping 5 1 20 Join Using the lt join gt element it is possible to map properties of one class to several tables that have a one to one relationship For example lt join 91 Kapitel 5 Grundlagen des O R table tablename schema owner catalog catalog fetch join select inverse true false 2909999 optional true false gt Key 22 gt lt property gt lt join table the name of the joined table schema optional overrides the schema name specified by the root lt hibernate mapping gt element catalog optional overrides the catalog name specified by the root lt hibernate mapping gt element fetch optional defaults to join if set to join the default Hibernate will use an inner join to retrieve a lt join gt defined by a class or its superclasses It will use an outer join for a lt join gt defined by a subclass If set to select then Hibernate will use a sequential select for a lt join gt 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 lt join gt defined by the class and its superclasses
133. ally Tabelle 3 8 Hibernate SQL Dialekte hibernate dialect RDBMS Dialekt DB2 org hibernate dialect DB2Dialect DB2 AS 400 org hibernate dialect DB2400Dialect DB2 OS390 org hibernate dialect DB2390Dialect PostgreSQL org hibernate dialect PostgreSQLDialect MySQL org hibernate dialect MySQLDialect MySQL mit InnoDB org hibernate dialect MySQLInnoDBDialect MySQL mit MyISAM org hibernate dialect MySQLMyISAMDialect Oracle alle Versionen org hibernate dialect OracleDialect Oracle 9i org hibernate dialect Oracle9iDialect Oracle 10g org hibernate dialect Oraclel0gDialect Sybase org hibernate dialect SybaseDialect Sybase Anywhere org hibernate dialect SybaseAnywhereDialect Microsoft SQL Server org hibernate dialect SQLServerDialect SAP DB org hibernate dialect SAPDBDialect 43 Kapitel 3 Konfiguration RDBMS Dialekt Informix org hibernate dialect InformixDialect HypersonicSQL org hibernate dialect HSQLDialect Ingres org hibernate dialect IngresDialect Progress org hibernate dialect ProgressDialect Mckoi SQL org hibernate dialect MckoiDialect Interbase org hibernate dialect InterbaseDialect Pointbase org hibernate dialect PointbaseDialect FrontBase org hibernate dialect FrontbaseDialect Firebird org hibernate dialect FirebirdDialect 3 4 2 Outer Join Fetching If your database supports ANSI Oracle or Sybase style outer joins outer join fetching will often inc
134. and access the SessionFactory in any way you like Usually you would use a more sophisticated design and move the data access code into data access objects the DAO pattern See the Hibernate Wiki for more examples 24 Deployment und Test 1 3 3 Deployment und Test To deploy this application for testing we must create aWeb ARchive WAR First we must define the WAR descriptor as src main webapp WEB INF web xml lt xml version 1 0 encoding UTF 8 gt lt web app version 2 4 xmlns http java sun com xml ns j2ee xmlns xsi http www w3 org 2001 XMLSchema instance xsi schemaLocation http java sun com xml ns j2ee http java sun com xml ns j2ee web app 274 zsd gt lt servmlee gt lt servlet name gt Event Manager lt servlet name gt lt servler class gt org hibernate tutorial web EventManagerServlet lt servlet class gt lt servlet gt lt servlet mapping gt lt servlet name gt Event Manager lt servlet name gt lt url pattern gt eventmanager lt url pattern gt lt servlet mapping gt lt web app gt To build and deploy call mvn package in your project directory and copy the hibernate tutorial war file into your Tomcat webapps directory Wenn das Deployment erfolgt ist und Tomcat ausgef hrt wird greifen Sie mittels http localhost 8080 hibernate tutorial eventmanager auf die Anwendung zu Sehen Sie im Protokoll von Tomcat nach ob Hibernate initialisiert wird wenn die ers
135. and events It is the same code in Java private void addEmailToPerson Long personId String emailAddress Session session HibernateUtil getSessionFactory getCurrentSession session beginTransaction Person aPerson Person session load Person class personld adding to the emailAddress collection might trigger a lazy load of the collection aPerson getEmailAddresses add emailAddress session getTransaction commit This time we did not use a fetch query to initialize the collection Monitor the SQL log and try to optimize this with an eager fetch 1 2 5 Bidirektionale Assoziationen Next you will map a bi directional association You will make the association between person and event work from both sides in Java The database schema does not change so you will still have many to many multiplicity First add a collection of participants to the Event class private Set participants new HashSet public Set getParticipants return participants 19 Kapitel 1 Tutorial public void setParticipants Set participants this participants participants Now map this side of the association in Event hbm xml lt set name participants table PERSON_EVENT inverse true gt lt key column EVENT_ID gt lt many to many column PERSON_ID class events Person gt lt set These are normal set mappings in both mapping documents Notice that the column names
136. ank generierten GUID String auf dem MS SQL Server und MySQL native selects identity sequence Of hilo depending upon the capabilities of the underlying database assigned lets the application assign an identifier to the object before save is called This is the default strategy if no lt generator gt element is specified select retrieves a primary key assigned by a database trigger by selecting the row by some unique key and retrieving the primary key value foreign uses the identifier of another associated object It is usually used in conjunction with a lt one to one gt primary key association sequence identity 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 71 Kapitel 5 Grundlagen des O R 5 1 4 2 Hi lo Algorithmus The hilo and seghilo 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 lt id name id type long column cat_id gt lt generator class hilo gt lt param name
137. apper type java lang String Of java util Date If your legacy database table has composite keys you can use a user defined class with properties of these types see the section on composite identifiers later in the chapter Die Bezeichner Property ist v llig optional Sie k nnen sie ausgeschaltet lassen und Hibernate verfolgt die Objektbezeichner intern Allerdings empfehlen wir diese Einstellung nicht In fact some functionality is available only to classes that declare an identifier property e Transitive reattachment for detached objects cascade update or cascade merge see Abschnitt 10 11 Transitive Persistenz e Session saveOrUpdate e Session merge We recommend that you declare consistently named identifier properties on persistent classes and that you use a nullable i e non primitive type 4 1 3 Bevorzugung nicht finaler Klassen optional Ein zentrales Feature von Hibernate Proxies hangt davon ab ob die persistente Klasse entweder nicht final oder der alle Methoden als ffentlich erklarenden Implemetierung eines Interface You can persist final classes that do not implement an interface with Hibernate You will not however be able to use proxies for lazy association fetching which will ultimately limit your options for performance tuning You should also avoid declaring public final methods on the non final classes If you want to use a class with a public final method you must explicitly disable pr
138. art des Tools 21 1 2 Start des Tools Das SchemaExport Tool schreibt ein DDL Skript um DDL Anweisungen zu standardisieren und oder auszuf hren The following table displays the schemaExport command line options java cp hibernate_classpaths org hibernate tool hbm2dd1 SchemaExport options mapping_files Tabelle 21 2 schemazxport Befehlszeilenoptionen Option Beschreibung quiet do not output the script to stdout drop nur Tabellen droppen create nur Tabellen erstellen text do not export to the database output my_schema ddl ddl Skript an eine Datei ausgeben naming eg MyNamingStrategy w hlen Sie eine NamingStrategy config hibernate cfg xml Hibernate Konfiguration aus einer XML Datei lesen Datenbank Properties aus einer Datei lesen properties hibernate properties format generierte SQL sauber im Skript formatieren delimiter einen Delimiter f r das Zeilenende des Skripts setzen You can even embed SchemaExport in your application Configuration cfg S s new SchemaExport cfg create false true 21 1 3 Properties Database properties can be specified wie System Properties mit D lt property gt N hibernate properties in einer benannten Properties Datei mit properties Die ben tigten Properties sind Tabelle 21 3 SchemaExport Connection Properties Property Name Beschreibung hibernate connection driver_class jdbc Treiberklasse
139. as cat Note that HQL subqueries can occur only in the select or where clauses Note that subqueries can also utilize row value constructor syntax See Abschnitt 15 18 Die Syntax des Row Value Constructors for more information 15 14 HQL Beispiele Hibernate queries can be quite powerful and complex In fact the power of the query language is one of Hibernate s main strengths The following example queries are similar to queries that have been used on recent projects Please note that most queries you will write will be much simpler than the following examples The following query returns the order id number of items the given minimum total value and the total value of the order for all unpaid orders for a particular customer The results are ordered by total value In determining the prices it uses the current catalog The resulting SQL query against the ORDER ORDER_LINE PRODUCT CATALOG and PRICE tables has four inner joins and an uncorrelated subselect select order id sum price amount count item from Order as order join order lineltems as item join item product as product Catalog as catalog join catalog prices as price where order paid false and order customer customer and price product product and catalog effectiveDate lt sysdate and catalog effectiveDate gt all select cat effectiveDate from Catalog as cat where cat effectiveDate lt sysdate group by order having sum p
140. ass with XDoclet mappings 100 Die Verwendung von XDoclet Markup package eg import java util Set import java util Date J hibernate class ble iT CAMiSu 2 public class Cat private Long id identifier private Date birthdate private Cat mother private Set kittens private Color color private char sex private float weight hibernate id generator class native a column NCATETDL A public Long getId return id private void setId Long id this id id hibernate many to one column PARENT_ID A public Cat getMother return mother void setMother Cat mother this mother mother hibernate property column BIRTH_DATE public Date getBirthdate return birthdate void setBirthdate Date date birthdate date hibernate property column WEIGHT sA public float getWeight return weight void setWeight float weight 101 Kapitel 5 Grundlagen des O R this weight weight hibernate property column COLOR not null true 24 public Color getColor return color void setColor Color color this color color hibernate set inverse true order by BIRTH_DATE hibernate collection key column PARENT_ID hibernate collection one to many 24 public Set getkittens return kittens void setKittens Set kittens this kittens kittens addK
141. assen public Color getColor return color void setColor Color color this color color void setSex char sex this sex sex public char getSex return sex void setLitterId int id this litterId id public int getLitterId return litterId void setMother Cat mother this mother mother public Cat getMother return mother void setKittens Set kittens this kittens kittens public Set getKittens return kittens addKitten not needed by Hibernate public void addKitten Cat kitten kitten setMother this kitten setLitterId kittens size kittens add kitten The four main rules of persistent classes are explored in more detail in the following sections 4 1 1 Implementierung eines No Argument Konstruktors Cat has a no argument constructor All persistent classes must have a default constructor which can be non public so that Hibernate can instantiate them using Constructor newInstance It is recommended that you have a default constructor with at least package visibility for runtime proxy generation in Hibernate 4 1 2 Bereitstellung einer Bezeichner Property optional Cat has a property called id This property maps to the primary key column of a database table The property might have been called anything and its type might have been any primitive type 54 Bevorzugung nicht finaler Klassen optional any primitive wr
142. ast ASTQueryTranslatorFactory or org hibernate hql classic ClassicQueryTranslatorFactor hibernate query substitutions Is used to map from tokens in Hibernate queries to SQL tokens tokens might be function or literal names for example e g hqlLiteral SQL_LITERAL hqlFunction SQLFUNC hibernate hbm2ddl auto Automatically validates or exports schema DDL to the database when the SessionFactory Is created With create drop the database schema will be dropped when the SessionFactory Is closed explicitly 42 SQL Dialekte Property Name hibernate bytecod Zweck e g validate updat drop instead of runtime property and cannot be set in hibernate cfg xml Reflection can sometimes be useful when troubleshooting Hibernate always requires either CGLIB or javassist even if you turn off the optimizer a System level e g true false creat creat use_reflection_optim amp mrables the use of bytecode manipulation reflection This is hibernate bytecode provider Both javassist or cglib can be used as byte manipulation engines the default is javassist e g javassist cglib 3 4 1 SQL Diale kte Always set the hibernate dialect property to the correct org hibernate dialect Dialect subclass for your database If you specify a dialect Hibernate will use sensible defaults for some of the other properties listed above This means that you will not have to specify them manu
143. ations later in this chapter for more information The following example shows a map of Part entities by name where partName is a persistent property of Part Notice the use of a formula based index lt map name parts cascade all gt lt key column productId not null true gt lt map key formula partName gt lt one to many class Part gt lt map 6 3 Fortgeschrittene Collection Mappings 6 3 1 Sortierte Collections Hibernate unterst tzt java util SortedMap Und java util SortedSet implementierende Collections Sie m ssen ein Vergleichsprogramm in der Mapping Datei bestimmen lt set name aliases table person_aliases sort natural gt lt key column person gt lt element column name type string gt lt set gt lt map name holidays sort my custom HolidayComparator gt lt key column year_id gt lt map key column hol_name type string gt lt element column hol_date type date gt lt map gt Erlaubte Werte f r das sort Attribut sind unsorted natural und der Name einer Klassenimplementierung java util Comparator Sortierte Collections verhalten sich tats chlich wie java util TreeSet oder java util TreeMap If you want the database itself to order the collection elements use the order by attribute Of set bag Or map mappings This solution is only available under JDK 1 4 or higher and is implemented using LinkedHashSet Of LinkedHashMap This performs the ordering
144. ave to worry about transaction demarcation in your code if you would like to write a portable persistence layer use the optional Hibernate Transaction API for this You call the HibernateContext to access a Session HAR deployment the Hibernate JMX service is deployed using a JBoss service deployment descriptor in an EAR and or SAR file as it supports all the usual configuration options of a Hibernate SessionFactory However you still need to name all your mapping files in the deployment descriptor If you use the optional HAR deployment JBoss will automatically detect all mapping files in your HAR file Weitere Informationen zu diesen Optionen finden Sie im JBoss AS Benutzerhandbuch 30 JCA Support Another feature available as a JMX service is runtime Hibernate statistics See Abschnitt 3 4 6 Die Hibernate Statistik for more information 2 4 JCA Support Hibernate can also be configured as a JCA connector Please see the website for more information Please note however that atthis stage Hibernate JCA support is under development 2 5 Contextual sessions Most applications using Hibernate need some form of contextual session where a given session is in effect throughout the scope of a given context However across applications the definition of what constitutes a context is typically different different contexts define different scopes to the notion of current Applications using Hibernate prior to version 3 0 t
145. be mapped in the following way lt join gt lt key column employeeld gt lt subselect gt select employeeld orgId from Employments group by orgId having startDate max startDate lt subselect gt lt many to one name mostRecentEmployer class Organization column orgId gt Joan This functionality allows a degree of creativity and flexibility but it is more practical to handle these kinds of cases using HQL or a criteria query 135 136 Komponenten Mapping The notion of a component is re used in several different contexts and purposes throughout Hibernate 8 1 Abh ngige Objekte A component is a contained object that is persisted as a value type and not an entity reference The term component refers to the object oriented notion of composition and not to architecture level components For example you can model a person like this public class Person private java util Date birthday private Name name private String key public String getKey return key private void setKey String key this key key public java util Date getBirthday return birthday public void setBirthday java util Date birthday this birthday birthday h public Name getName return name public void setName Name name this name name public class Name ghar initial Sieen eec String last public String getFirst return first void setF
146. ble for a particular database If you have several databases for easier startup you should use several lt session factory gt configurations in several configuration files The first four property elements contain the necessary configuration for the JDBC connection The dialect property element specifies the particular SQL variant Hibernate generates Tipp Qa In most cases Hibernate is able to properly determine which dialect to use See for more information Hibernate s automatic session management for persistence contexts is particularly useful in this context The hom2ddl auto option turns on automatic generation of database schemas directly into the database This can also be turned off by removing the configuration option or redirected to a file with the help of the schemaExport Ant task Finally add the mapping file s for persistent classes to the configuration Save this file as hibernate cfg xml into the src main resources directory 1 1 5 Building with Maven We will now build the tutorial with Maven You will need to have Maven installed it is available from the Maven download page http maven apache org download html Maven will read the pom xml file we created earlier and know how to perform some basic project tasks First lets run the compile goal to make sure we can compile everything so far hibernateTutorial mvn compile NFO Scanning for projects FO EE
147. calling sessionFactory getCurrentSession You will always get a Session scoped to the current database transaction This has to be configured for either resource local or JTA environments see Abschnitt 2 5 Contextual sessions You can extend the scope of a Session and database transaction until the view has been rendered This is especially useful in servlet applications that utilize a separate rendering phase after the request has been processed Extending the database transaction until view rendering is achieved by implementing your own interceptor However this will be difficult if you rely on EJBs with container managed transactions A transaction will be completed when an EJB method returns before rendering of any view can start See the Hibernate website and forum for tips and examples relating to this Open Session in View pattern 12 1 2 Lange Konversationen The session per request pattern is not the only way of designing units of work Many business processes require a whole series of interactions with the user that are interleaved with database 182 Die Ber cksichtigung der Objektidentit t accesses In web and enterprise applications it is not acceptable for a database transaction to span a user interaction Consider the following example e The first screen of a dialog opens The data seen by the user has been loaded in a particular Session and database transaction The user is free to modify the objects e
148. can be imported explicitly rather than relying upon auto import true You can also import classes and interfaces that are not explicitly mapped lt import class java lang Object rename Universe gt lt import 94 Any gt 12 class ClassName rename ShortName class the fully qualified class name of any Java class 5 1 24 Any oo rename optional defaults to the unqualified class name a name that can be used in the query language There is one more type of property mapping The lt any gt mapping element 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 The meta type 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 ia type You must specify the mapping from values of the meta type to class names lt any name being id type long meta type string gt lt meta value value TBL_ANIMAL lt meta value value TBL_HUMAN lt meta value value TBL_ALIEN
149. ciation is fetched even when only the identifier is accessed It is also more transparent since no proxy is visible to the application This approach requires buildtime bytecode instrumentation and is rarely necessary Lazy attribute fetching an attribute or single valued association is fetched when the instance variable is accessed This approach requires buildtime bytecode instrumentation and is rarely necessary 261 Kapitel 20 Verbesserung der We have two orthogonal notions here when is the association fetched and how is it fetched It is important that you do not confuse them We use fetch to tune performance We can use lazy to define a contract for what data is always available in any detached instance of a particular class 20 1 1 Der Umgang mit lazy Assoziationen By default Hibernate3 uses lazy select fetching for collections and lazy proxy fetching for single valued associations These defaults make sense for most associations in the majority of applications If you set hibernate default_batch_fetch_size Hibernate will use the batch fetch optimization for lazy fetching This optimization can also be enabled at a more granular level Please be aware that access to a lazy association outside of the context of an open Hibernate session will result in an exception For example s sessions openSession Transaction tx s beginTransaction User u User s createQuery from User u where u name user
150. ck 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 unigue optional defaults to false specifies that a unique constraint exists upon all mapped columns of the component Nehmen wir etwa das folgende lt propert ies gt Mapping lt class name Person gt lt id name personNumber gt lt properties name name unique true update false gt lt property name firstName gt lt property name initial gt lt property name lastName gt lt properties gt lt class gt You might have some legacy data association that refers to this unique key of the Person table instead of to the primary key lt many to one name person class Person property ref name gt lt column name firstName gt lt column name initial gt lt column name lastName gt lt many to one gt The use of this outside the context of mapping legacy data is not recommended 5 1 17 Subclass Polymorphic persistence requires the declaration of each subclass of the root persistent class For the table per class hierarchy mapping strategy the lt subclass gt declaration is used For example 88 Joined subclass lt subclass name ClassName discriminator value discriminator_value proxy ProxyInterface 29099899 lazy true false
151. contains some extra optional attributes and elements that affect the database schemas exported by the schema export tool for example the not nu11 attribute 5 1 1 Doctype All XML mappings should declare the doctype shown The actual DTD can be found at the URL above in the directory 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 5 1 1 1 EntityResolver Hibernate will first attempt to resolve DTDs in its classpath It does this is by registering a custom org xml sax EntityResolver implementation with the SAXReader it uses to read in the xml files This custom Ent ityResolver recognizes two different systemld namespaces Ahibernate namespace is recognized whenever the resolver encounters a systemld starting with http hibernate sourceforge net The resolver attempts to resolve these entities via the classloader which loaded the Hibernate classes e A user namespace iS recognized whenever the resolver encounters a systemld 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 64 Hibernate mapping The following is an example of utilizing user namespacing lt xml version
152. create table Address addressId bigint not null primary key 7 6 Komplexere Assoziations Mappings More complex association joins are extremely rare Hibernate handles more complex situations by using SQL fragments embedded in the mapping document For example if a table with historical account information data defines accountNumber effectiveEndDate and effectiveStartDatecolumns it would be mapped as follows lt properties name currentAccountKey gt lt property name accountNumber type string not null true gt lt property name currentAccount type boolean gt lt formula gt case when effectiveEndDate is null then 1 else 0 end lt formula gt 134 Komplexere Assoziations Mappings lt property gt lt properties gt lt property name effectiveEndDate type date gt lt property name effectiveStateDate type date not null true gt You can then map an association to the current instance the one with null effectiveEndDate by using lt many to one name currentAccountInfo property ref currentAccountKey class AccountInfo gt lt column name accountNumber gt lt formula gt 1 lt formula gt lt many to one gt In amore complex example imagine that the association between Employee and Organization is maintained in an Employment table full of historical employment data An association to the employee s most recent employer the one with the most recent startDate could
153. ction JOTMTransactionManagerLookup JOTM org hibernate transaction JOnASTransactionManagerLookup JOnAS org hibernate transaction JRun4TransactionManagerLookup JRun4 org hibernate transaction BESTransact ionManagerLookup Borland ES 3 8 2 JN DI bound SessionFactory A JNDI bound Hibernate sessionFactory can simplify the lookup function of the factory and create new Sessions This is not however related to a JNDI bound Datasource both simply use the same registry If you wish to have the SessionFactory bound to a JNDI namespace specify a name e g java hibernate SessionFactory Using the property hibernate session_factory_name If this property is omitted the SessionFactory will not be bound to JNDI This is especially useful in environments with a read only JNDI default implementation in Tomcat for example Beim Binden der SessionFactory an JNDI wird Hibernate die Werte von hibernate jndi url hibernate jndi class verwenden um einen Anfangskontext zu initiieren Werden diese nicht festgelegt so wird der Standard InitialContext verwendet 49 Kapitel 3 Konfiguration Hibernate will automatically place the SessionFactory in JNDI after you call cfg buildSessionFactory This means you will have this call in some startup code or utility class in your application unless you use JMX deployment with the HibernateService this is discussed later in greater detail If you use a JNDI SessionFactory an EJB or any o
154. curs during rendering of the view See the Hibernate Wiki for examples of this Open Session in View pattern In an application with a separate business tier the business logic must prepare all collections that the web tier needs before returning This means that the business tier should load all the data and return all the data already initialized to the presentation web tier that is required for a particular use case Usually the application calls Hibernate initialize for each collection that will be needed in the web tier this call must occur before the session is closed or retrieves the collection eagerly using a Hibernate query with a FETCH clause or a FetchMode JOIN in Criteria This is usually easier if you adopt the Command pattern instead of a Session Facade You can also attach a previously loaded object to a new Session with merge Of lock before accessing uninitialized collections or other proxies Hibernate does not and certainly should not do this automatically since it would introduce impromptu transaction semantics Sometimes you do not want to initialize a large collection but still need some information about it like its size for example or a subset of the data Sie k nnen einen Collection Filter verwenden um die Gr e der Collection zu ermitteln ohne diese zu initialisieren 266 Die Verwendung von Stapelabruf Batch Fetching Integer s createFilter collection select count list
155. d equals bar getId JVM Identit t foo bar For objects attached to a particular session i e in the scope of a Session the two notions are equivalent and JVM identity for database identity is guaranteed by Hibernate While the application might concurrently access the same persistent identity business object in two different sessions the two instances will actually be different JVM identity Conflicts are resolved using an optimistic approach and automatic versioning at flush commit time This approach leaves Hibernate and the database to worry about concurrency It also provides the best scalability since guaranteeing identity in single threaded units of work means that it does not need expensive locking or other means of synchronization The application does not need to synchronize on any business object as long as it maintains a single thread per session Within a Session the application can safely use to compare objects However an application that uses outside of a Session might produce unexpected results This might occur even in some unexpected places For example if you put two detached instances into the same set both might have the same database identity i e they represent the same row JVM identity however is by definition not guaranteed for instances in a detached state The developer has to override the equals and hashCode methods in persistent classes and implement their own notion of object
156. d level cache operation to minimize writes at the cost of more frequent reads This setting is most useful for clustered caches and in Hibernate3 is enabled by default for clustered cache implementations 40 Optionale Properties der Konfiguration Property Name Zweck e g true false hibernate cache use_query_cache Enables the query cache Individual queries still have to be set cachable e g true false hibernate cache use_second_level_cache Can be used to completely disable the second level cache which is enabled by default for classes which specify a lt cache gt mapping e g true false hibernate cache query_cache_factory Der Klassenname eines anwenderdefinierten QueryCache Interface Standard ist das eingebaute st andardQueryCache e g classname of QueryCach hibernate cache region_prefix Ein fur Cache Bereiche der zweiten Ebene zu verwendender Prafix e g prefix hibernate cache use_structured_entries Bringt Hibernate dazu Daten im Cachespeicher der zweiten Ebene in einer f r den Benutzer freundlicheren Art zu speichern e g true false Tabelle 3 6 Hibernate Transaktions Properties Property Name Zweck hibernate transaction factory_class jta UserTransaction Der Klassenname einer TransactionFactory der mit der Hibernate Transaction API Anwenderprogrammierschnittstelle zu verwenden ist standardm ig JDBCTransact ionFactory e g classname of
157. d read only entity to a given SQL subselect expression lt class name Summary gt lt subselect gt select item name max bid amount count from item join bid on bid item_id item id group by item name lt subselect gt lt synchronize table item gt lt synchronize table bid gt lt id name name gt lt class gt 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 lt subselect gt is available both as an attribute and a nested mapping element 5 1 4 id Gemappte Klassen m ssen die Spalte des Prim rschl ssels der Datenbanktabelle deklarieren Die meisten Klassen werden auBerdem eine Property nach Art von JavaBeans besitzen die den eindeutigen Bezeichner einer Instanz enth lt Das lt id gt Element definiert das Mapping von der Property zur Spalte des Prim rschl ssels name propertyName type typename column column_name unsaved value null any none undefined id_value 292090899 access field property ClassName gt node element name attribute name element attribute 69 Kapitel 5 Grundlagen des O R lt generator class generatorClass gt lt id gt name optional the name of the identifier property type optional Ein Name der den Hibernate Typ anzeigt column optional defaults to the property name the name of the p
158. d to lock any data that you are updating Usually you would set FlushMode MANUAL On an extended Session so that only the last database transaction cycle is allowed to actually persist all modifications made in this conversation Only this last database transaction will include the flush operation and then close the session to end the conversation This pattern is problematic if the session is too big to be stored during user think time for example an HttpSession should be kept as small as possible As the session is also the first level cache and contains all loaded objects we can probably use this strategy only for a few request response cycles Use a Session only for a single conversation as it will soon have stale data 191 Kapitel 12 Transactions and Note Earlier versions of Hibernate required explicit disconnection and reconnection of a Session These methods are deprecated as beginning and ending a transaction has the same effect Keep the disconnected Session close to the persistence layer Use an EJB stateful session bean to hold the session in a three tier environment Do not transfer it to the web layer or even serialize it to a separate tier to store it in the HttpSession The extended session pattern or session per conversation is more difficult to implement with automatic current session context management You need to supply your own implementation of the CurrentSessionContext for this See the H
159. developer from 95 percent of common data persistence related programming tasks Hibernate may not be the best solution for data centric applications that only use stored procedures to implement the business logic in the database it is most useful with object oriented domain models and business logic in the Java based middle tier However Hibernate can certainly help you to remove or encapsulate vendor specific SQL code and will help with the common task of result set translation from a tabular representation to a graph of objects Falls Ihnen Hibernate und Objekt Relationales Mapping oder sogar Java neu sind orientieren Sie sich bitte an folgenden Schritten 1 Read Kapitel 1 Tutorial for a tutorial with step by step instructions The source code for the tutorial is included in the distribution in the doc reference tutorial directory 2 Read Kapitel 2 Architektur to understand the environments where Hibernate can be used 3 View the eg directory in the Hibernate distribution It contains a simple standalone application Copy your JDBC driver to the 1ib directory and edit etc hibernate properties specifying correct values for your database From a command prompt in the distribution directory type ant eg using Ant or under Windows type build eg 4 Use this reference documentation as your primary source of information Consider reading JPwH if you need more help with application design or if you prefer a step by step tutorial Als
160. directionality multiplicity and collection behavior 1 2 2 Eine unidirektionale Set basierte Assoziation By adding a collection of events to the Person class you can easily navigate to the events for a particular person without executing an explicit query by calling Person getEvents Multi valued associations are represented in Hibernate by one of the Java Collection Framework contracts here we choose a java util Set because the collection will not contain duplicate elements and the ordering is not relevant to our examples public class Person private Set events new HashSet public Set getEvents return events public void setEvents Set events this events events Before mapping this association let s consider the other side We could just keep this unidirectional or create another collection on the Event if we wanted to be able to navigate it from both directions This is not necessary from a functional perspective You can always execute an explicit query to retrieve the participants for a particular event This is a design choice left to you but what is clear from this discussion is the multiplicity of the association many valued on both sides is called a many to many association Hence we use Hibernate s many to many mapping lt class name Person table PERSON gt lt id name id column PERSON_ID gt lt generator class native gt Sy Glee lt property name age gt lt property
161. dren inverse true gt lt key column parent_id gt lt one to many class Child gt lt set gt The following code would be used to add a new child Parent p Parent session load Parent class pid 290 Cascading life cycle Child c new Child c setParent p p getChildren add c session save c session flush Only one SQL INSERT would now be issued You could also create an addchild method of Parent public void addChild Child c c setParent this children add c The code to add a child looks like this Parent p Parent session load Parent class pid Child c new Child pP adachildie session save c session flush 22 3 Cascading life cycle You can address the frustrations of the explicit call to save by using cascades lt set name children inverse true cascade all gt lt key column parent_id gt lt one to many class Child gt lt set gt This simplifies the code above to Parent p Parent session load Parent class pid Child c new Child Praddchalaite r session flush Similarly we do not need to iterate over the children when saving or deleting a Parent The following removes p and all its children from the database Parent p Parent session load Parent class pid 291 Kapitel 22 Beispiel Parent session delete p session flush However the following code Paren
162. dynamic update true false dynamic insert true false entity name EntityName node element name extends SuperclassName gt lt property gt lt subclass gt 12 name the fully qualified class name of the subclass discriminator value optional defaults to the class name a value that distinguishes individual subclasses proxy optional specifies a class or interface used for lazy initializing proxies lazy optional defaults to true setting lazy false disables the use of lazy fetching Each subclass declares its own persistent properties and subclasses lt version gt and lt id gt 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 For information about inheritance mappings see Kapitel 9 Inheritance mapping 5 1 18 Joined subclass 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 To do this you use the lt joined subclass gt element For example lt joined subclass name ClassName table tablename proxy ProxyInterface 299899 lazy true false dynamic update true false dynamic insert true false schema schema catalog catalog extends SuperclassName persister ClassName
163. e default access optional defaults to property the strategy Hibernate should use for accessing all properties It can be a custom implementation of PropertyAccessor default lazy optional defaults to true the default value for unspecified 1azy attributes of class and collection mappings auto import optional defaults to true specifies whether we can use unqualified class names of classes in this mapping in the query language package optional specifies a package prefix to use for unqualified class names in the eeeseeooqooaoogeoos ja OY 17 19 20 H N 66 Class gt e O O O 8 086 REO 88 8 Q node element name 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 table optional defaults to the unqualified class name the name of its database table discriminator value optional defaults to the class name a value that distinguishes individual subclasses that is used for polymorphic behavior Acceptable values include nu11 and not null mutable optional defaults to true specifies that instances of the class are not mutable schema optional overrides the schema name specified by the root lt hibernate mapping gt element catalog optional overrides the catalog name specified by the root lt hibernate mapping gt element proxy opt
164. e cascade all none save update delete Jall delete orphan delete orphan sort unsorted natural comparatorClass order by column_name asc desc where arbitrary sql where condition fetch join select subselect batch size N access field property ClassName 108 Collection Mappings optimistic lock true false mutable true false D node element name embed xml true false OY coco IS lt map key gt lt element gt lt map gt 8 O 889 o 898 8 name the collection property name table optional defaults to property name the name of the collection table It is not used for one to many associations schema optional the name of a table schema to override the schema declared on the root element lazy optional defaults to true disables lazy fetching and specifies that the association is always eagerly fetched It can also be used to enable extra lazy fetching where most operations do not initialize the collection This is suitable for large collections inverse optional defaults to false marks this collection as the inverse end of a bidirectional association cascade optional defaults to none enables operations to cascade to child entities sort optional specifies a sorted collection with natural sort order or a given comparator class order by optional JDK1 4 only specifies a table column or columns that define the iteration
165. e Even in this case the above classification is still useful It reflects how Hibernate locates individual rows of the collection 20 5 2 Listen Maps idbags und Sets sind die am effizientesten zu aktualisierenden Collections From the discussion above it should be clear that indexed collections and sets allow the most efficient operation in terms of adding removing and updating elements There is arguably one more advantage that indexed collections have over sets for many to many associations or collections of values Because of the structure of a Set Hibernate does not UPDATE a row when an element is changed Changes to a set always work via INSERT and DELETE of individual rows Once again this consideration does not apply to one to many associations After observing that arrays cannot be lazy you can conclude that lists maps and idbags are the most performant non inverse collection types with sets not far behind You can expect sets to be the most common kind of collection in Hibernate applications This is because the set semantics are most natural in the relational model However in well designed Hibernate domain models most collections are in fact one to many associations with inverse true For these associations the update is handled by the many to one end of the association and so considerations of collection update performance simply do not apply 277 Kapitel 20 Verbesserung d
166. e 3 1 Hibernate JDBC Properties Property Name Zweck hibernate connection driver_class JDBC driver class hibernate connection url JDBC URL hibernate connection username database user hibernate connection password database user password hibernate connection pool_size maximum number of pooled connections Hibernate s own connection pooling algorithm is however quite rudimentary It is intended to help you get started and is not intended for use in a production system or even for performance testing You should use a third party pool for best performance and stability Just replace the hibernate connection pool_size property with connection pool specific settings This will turn off Hibernate s internal pool For example you might like to use c3p0 C3P0 is an open source JDBC connection pool distributed along with Hibernate in the 1ib directory Hibernate will use its org hibernate connection C3P0ConnectionProvider for connection pooling if you set hibernate c3p0 properties If you would like to use Proxool refer to the packaged hibernate properties and the Hibernate web site for more information The following is an example hibernate properties file for c3p0 hibernate connection driver_class org postgresql Driver hibernate connection url jdbc postgresql localhost mydatabase hibernate connection username myuser hibernate connection password secret hibernate c3p0 min_size 5 hibernate c3p0 max_size 20 hiberna
167. e and EJB deployment 51 52 Persistente Klassen Persistent classes are classes in an application that implement the entities of the business problem e g Customer and Order in an E commerce application Not all instances of a persistent class are considered to be in the persistent state For example an instance can instead be transient or detached Hibernate works best if these classes follow some simple rules also known as the Plain Old Java Object POJO programming model However none of these rules are hard requirements Indeed Hibernate3 assumes very little about the nature of your persistent objects You can express a domain model in other ways using trees of Map instances for example 4 1 Ein einfaches POJO Beispiel Most Java applications require a persistent class representing felines For example package eg import java util Set import java util Date public class Cat private Long id identifier private Date birthdate private Color color private char sex private float weight private int litterId private Cat mother private Set kittens new HashSet private void setId Long id this id id public Lang getid return id void setBirthdate Date date birthdate date public Date getbirthdate return birthdate void setWeight float weight this weight weight public float getWeight return weight 53 Kapitel 4 Persistente Kl
168. e application to specify atomic units of work It abstracts the application from the underlying JDBC JTA or CORBA transaction A Session might span several Transactions in some cases However transaction demarcation either using the underlying API or Transaction is never optional ConnectionProvider org hibernate connection ConnectionProvider Optional A factory for and pool of JDBC connections It abstracts the application from underlying Datasource Of DriverManager It is not exposed to application but it can be extended and or implemented by the developer TransactionFactory org hibernate TransactionFactory Optional A factory for Transaction instances It is not exposed to the application but it can be extended and or implemented by the developer Extension Interfaces Hibernate offers a range of optional extension interfaces you can implement to customize the behavior of your persistence layer See the API documentation for details Given a minimal architecture the application bypasses the Transaction TransactionFactory and or connect ionProvider APIs to communicate with JTA or JDBC directly 29 Kapitel 2 Architektur 2 2 Instanzstatus An instance of a persistent class can be in one of three different states These states are defined in relation to a persistence context The Hibernate session object is the persistence context The three different states are as follows transient The instance is not associat
169. e class and various collection elements These filter conditions however can be parameterized The application can then decide at runtime whether certain filters should be enabled and what their parameter values should be Filters can be used like database views but they are parameterized inside the application Um Filter zu benutzen m ssen diese zun chst definiert und anschlie end den betreffenden Mapping Elementen zugef gt werden Um einen Filter zu definieren verwenden Sie das lt filter def gt Element innerhalb eines lt hibernate mapping gt Elements lt filter def name myFilter gt lt filter param name myFilterParam type string gt lt filter def gt This filter can then be attached to a class lt class name myClass gt lt filter name myFilter condition myFilterParam MY_FILTERED_COLUMN gt lt class gt Or to a collection SSI a noe lt filter name myFilter condition myFilterParam MY_FILTERED_COLUMN gt lt set gt Or to both or multiples of each at the same time The methods on Session are enableFilter String filterName getEnabledFilter String filterName and disableFilter String filterName By default filters are not enabled for a given session Filters must be enabled through use of the 251 Kapitel 18 Das Filtern von Daten Session enableFilter method which returns an instance ofthe Filter interface If you used the simple filter defined ab
170. e displayed java Hibernate insert into EVENTS EVENT_DATE title EVENT_ID values This is the INSERT executed by Hibernate To list stored events an option is added to the main method if args 0 equals store mgr createAndStoreEvent My Event new Date else if args 0 equals list List events mgr listEvents for int i 0 i lt events size i Event theEvent Event events get i System out printin Event theEvent getTitle Time theEvent getDate i Anew listEvents method is also added private List listEvents Session session HibernateUtil getSessionFactory getCurrentSession session beginTransaction List result session createQuery from Event list session getTransaction commit return result Here we are using a Hibernate Query Language HQL query to load all existing Event objects from the database Hibernate will generate the appropriate SQL send it to the database and populate Event objects with the data You can create more complex queries with HQL See Kapitel 15 HQL Die Hibernate Query Language for more information Now we can call our new functionality again using the Maven exec plugin mvn exec java Dexec mainClass org hibernate tutorial EventManager Dexec args list 13 Kapitel 1 Tutorial 1 2 Teil 2 Mapping Assoziationen So far we have mapped a single persistent entit
171. e global transaction to rollback You do not need to use the Hibernate Transaction API at all with BMT or CMT and you get automatic propagation of the current Session bound to the transaction When configuring Hibernate s transaction factory choose org hibernate transaction JTATransactionFactory if you use JTA directly BMT and org hibernate transaction CMTTransactionFactory in a CMT session bean Remember to also set hibernate transaction manager_lookup_class Ensure that your hibernate current_session_context_class is either unset backwards compatibility or is set to jta The getCurrentSession operation has one downside in a JTA environment There is one caveat to the use of after_statement connection release mode which is then used by default Due to a limitation of the JTA spec it is not possible for Hibernate to automatically clean up any unclosed ScrollableResults Of Iterator instances returned by scroll Or iterate You must release the underlying database cursor by calling ScrollableResults close Or Hibernate close Iterator explicitly from a finally block Most applications can easily avoid using scroll Or iterate from the JTA or CMT code 12 2 3 Der Umgang mit Ausnahmen If the Session throws an exception including any SQLException immediately rollback the database transaction call Session close and discard the session instance Certain methods of Session will not leave the session in a consistent sta
172. eFormat dateFormatter List result HibernateUtil getSessionFactory getCurrentSession createCriteria Event class list if result size 23 Kapitel 1 Tutorial ld y eut printin u lt ch2 gt Events in database lt h2 oy out println lt table border 1 Se out print lmiG lt tr Sa ont print in G lt th gt Event title lt th Bu Out printin lt th gt Event date lt th gt Out print lni t lt 7 ta oe Iterator it result iterator while it hasNext Event event Event it next OUE Pprinelniser D Out spain cine lt a evenk get bart le lt td air Cut sprint ilim lt td SS dalterormatter format event igetDate ON n lt tdi zZ out prine MOE Sy out println lt table Zuletzt wird die store Vorgang Zur createAndStore die Session des aktuellen Threads verwendet protected void createAndStoreEvent String title Event theEvent new Event theEvent setTitle title theEvent setDate theDate HibernateUtil getSessionFactory getCurrentSession save theEvent Event Methode gesendet die ebenfalls Date theDate The servlet is now complete A request to the servlet will be processed in a single Session and Transaction As earlier in the standalone application Hibernate can automatically bind these objects to the current thread of execution This gives you the freedom to layer your code
173. ead only for details you can make an HQL query or criteria read only so that entities loaded when the query or criteria executes scrolls or iterates are automatically made read only see Abschnitt 11 1 3 Loading read only entities from an HQL query criteria for details you can make a persistent entity that is already in the in the session read only see Abschnitt 11 1 4 Making a persistent entity read only for details 11 1 1 Entities of immutable classes When an entity instance of an immutable class is made persistent Hibernate automatically makes it read only An entity of an immutable class can created and deleted the same as an entity of a mutable class Hibernate treats a persistent entity of an immutable class the same way as a read only persistent entity of a mutable class The only exception is that Hibernate will not allow an entity of an immutable class to be changed so it is not read only 11 1 2 Loading persistent entities as read only Anmerkung Entities of immutable classes are automatically loaded as read only To change the default behavior so Hibernate loads entity instances of mutable classes into the session and automatically makes them read only call Session setDefaultReadOnly true To change the default back so entities loaded by Hibernate are not made read only call Session setDefaultReadOnly false You can determine the current setting by calling 172 Loading read only
174. echnically this function registration is handled through the org hibernate dialect function SQLFunctionRegistry class which is intended to allow users to provide custom function definitions without having to provide a custom dialect This specific behavior is not fully completed as of yet It is sort of implemented such that users can programatically register functions with the org hibernate cfg Configuration and those functions will be recognized for HQL 26 6 Type mappings This section scheduled for completion at a later date 321 322 References PoEAA Patterns of Enterprise Application Architecture 0 321 12742 0 von Martin Fowler Copyright 2003 Pearson Education Inc Addison Wesley Publishing Company JPwH Java Persistence with Hibernate Second Edition of Hibernate in Action 1 932394 88 5 http www manning com bauer2 von Christian Bauer und Gavin King Copyright 2007 Manning Publications Co Manning Publications Co 323 324
175. ed during user think time Check for this at the end of the conversation Detached Objects if you decide to use the session per request pattern all loaded instances will be in the detached state during user think time Hibernate allows you to reattach the objects and persist the modifications The pattern is called session per request with detached objects Automatic versioning is used to isolate concurrent modifications Extended or Long Session the Hibernate session can be disconnected from the underlying JDBC connection after the database transaction has been committed and reconnected when a new client request occurs This pattern is known as session per conversation and makes even reattachment unnecessary Automatic versioning is used to isolate concurrent modifications and the Session will not be allowed to be flushed automatically but explicitly Both session per request with detached objects and session per conversation have advantages and disadvantages These disadvantages are discussed later in this chapter in the context of optimistic concurrency control 12 1 3 Die Berucksichtigung der Objektidentitat An application can concurrently access the same persistent state in two different sessions However an instance of a persistent class is never shared between two Session instances It is for this reason that there are two different notions of identity 183 Kapitel 12 Transactions and Datenbank Identit t foo getI
176. ed subclass gt lt class gt Once again Payment is not mentioned explicitly If we execute a query against the Payment interface for example from Payment Hibernate automatically returns instances of CreditCardPayment and its subclasses since they also implement Payment CashPayment and ChequePayment but not instances of NonelectronicTransaction 150 Einschr nkungen 9 2 Einschr nkungen There are limitations to the implicit polymorphism approach to the table per concrete class mapping strategy There are somewhat less restrictive limitations to lt union subclass gt mappings The following table shows the limitations of table per concrete class mappings and of implicit polymorphism in Hibernate Tabelle 9 1 Features von Vererbungsmappings Vererbun Polymorg Polymorg Polymorg Polymorg Polymorg Polymorg Polymorg Outer many One One Many load Anfragen Verkn pf join to one to One to to get fetching Many Many table per lt many lt one lt one lt many s get Payfreont clas amp om supported class to one gt to one gt to to id Payment Order hierarchy many gt many gt p o join o payment pP table per lt many lt one lt one lt many s get Palyfreort clasfs om supported subclass to one gt to one gt to to id Payment Order many gt many gt p o join o payment p Tabelle lt many lt one lt one lt many s get Payfient clasfsgom supported pro to
177. ed to evaluate the foreign key of the map key class required the entity class used as the map key If your table does not have an index column and you still wish to Use List as the property type you can map the property as a Hibernate lt bag gt A bag does not retain its order when it is retrieved from the database but it can be optionally sorted or ordered 6 2 4 Collections von Werten und Many to Many Assoziationen Any collection of values or many to many associations requires a dedicated collection table with a foreign key column or columns collection element column or columns and possibly an index column or columns For a collection of values use the lt element gt tag For example lt element column column_name 111 Kapitel 6 Collection mapping formula any SQL expression type typename length L precision P scale 5 not null true false unique true false node element name column optional the name of the column holding the collection element values formula optional an SQL formula used to evaluate the element type required the type of the collection element A many to many association is specified using the lt many to many gt element lt many to many column column_name formula any SOL expression class ClassName fetch select join unique true false not found ignore exception entity name EntityName 009202009999
178. ed to integer literals in the generated SQL hibernate query substitutions toLowercase LOWER This would allow you to rename the SQL Lower function 3 4 6 Die Hibernate Statistik If you enable hibernate generate_statistics Hibernate exposes a number of metrics that are useful when tuning a running system via SessionFactory getStatistics Hibernate can even be configured to expose these statistics via JMX Read the Javadoc of the interfaces in org hibernate stats for more information 3 5 Protokollierung Hibernate utilizes Simple Logging Facade for Java http www slf4j org SLF4J in order to log various system events SLF4J can direct your logging output to several logging frameworks NOP Simple log4j version 1 2 JDK 1 4 logging JCL or logback depending on your chosen binding In order to setup logging you will need s1f4j api jar in your classpath together with the jar file for your preferred binding s1 4j 1094512 jar in the case of Log4J See the SLF4J documentation http www slf4j org manual html for more detail To use Log4j you will also need to place a log4j properties file in your classpath An example properties file is distributed with Hibernate in the src directory It is recommended that you familiarize yourself with Hibernate s log messages A lot of work has been put into making the Hibernate log as detailed as possible without making it unreadable It is an essential troubleshooting device The most
179. ed with any persistence context It has no persistent identity or primary key value persistent The instance is currently associated with a persistence context It has a persistent identity primary key value and can have a corresponding row in the database For a particular persistence context Hibernate guarantees that persistent identity is equivalent to Java identity in relation to the in memory location of the object detached abgesetzt The instance was once associated with a persistence context but that context was closed or the instance was serialized to another process It has a persistent identity and can have a corresponding row in the database For detached instances Hibernate does not guarantee the relationship between persistent identity and Java identity 2 3 JMX Integration JMX is the J2EE standard for the management of Java components Hibernate can be managed via a JMX standard service AN MBean implementation is provided in the distribution org hibernate jmx HibernateService For an example of how to deploy Hibernate as a JMX service on the JBoss Application Server please see the JBoss User Guide JBoss AS also provides these benefits if you deploy using JMX Session Management the Hibernate session s life cycle can be automatically bound to the scope of a JTA transaction This means that you no longer have to manually open and close the Session this becomes the job of a JBoss EJB interceptor You also do not h
180. editCardPayment table CREDIT_PAYMENT gt lt id name id type long column CREDIT_PAYMENT_ID gt lt generator class native gt lt id gt lt property name amount column CREDIT_AMOUNT gt lt class gt lt class name CashPayment table CASH_PAYMENT gt lt id name id type long column CASH_PAYMENT_ID gt lt generator class native gt lt id gt lt property name amount column CASH_AMOUNT gt lt class gt lt class name ChequePayment table CHEQUE_PAYMENT gt lt id name id type long column CHEQUE_PAYMENT_ID gt lt generator class native gt lt id gt lt property name amount column CHEQUE_AMOUNT gt lt class gt Notice that the Payment interface is not mentioned explicitly Also notice that properties of Payment are mapped in each of the subclasses If you want to avoid duplication consider using XML entities for example lt ENTITY allproperties SYSTEM allproperties xml gt in the DOCTYPE declaration and sallproperties in the mapping The disadvantage of this approach is that Hibernate does not generate SQL un ons when performing polymorphic queries Bei dieser Mapping Strategie wird in der Regel eine polymorphe Assoziation ZU Payment Mittels lt any gt gemappt lt any name payment meta type string id type long gt lt meta value value CREDIT class CreditCardPayment gt 149 Kapitel 9 Inheritance mapping lt meta value
181. eeeeeeeaeeeeeeeeeeeeeeeaeaaes 100 5 5 2 Die Verwendung von JDK 5 0 Annotationen 244444ss nennen 102 5 6 Generated Properties atsiri aa aa aAA AA EEEE 103 5 7 Column read and write expressions uusssssssssennenennnnnnnnnnnnnennnnnnnnnnnnnn nn 104 5 8 Auxiliary database objects sirsisrrsrronrninrrniisnrrsnn isan esse aa eeeeeeaaeeeeeeaaeeeeeeaaneeeees 104 6 Collection MAPPING ia 107 6 1 Persistente Collections uusnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnennnnnnnnnnn 107 6 2 Collection Mappings 244444444snnnnnnnnnnnnnennnnnnnnannnnnennnnnnnnnannnnnennnnnnnnannnnn 108 6 2 1 Collection Fremdschl ssel 444444440nHnnnnnnnnnnnnnn en nnnnnnnnnnenennn 110 6 2 2 Collection Elemente 4s4nnnnnnnnnnnnenennnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nn 110 6 2 3 Indizierte Collections 44444040nnnnannnnnnnennnnnnnnnnnnnnennnnnnnnannnnnnnn 110 6 2 4 Collections von Werten und Many to Many Assoziationen 111 6 2 5 One to Many Assoziationen 4usmssennnnsnnnnnenennnnnnnnnnnnnen en snnnnnnnnnn 114 6 3 Fortgeschrittene Collection Mappings cceeeeeeeeeaeeeeeeeeeeeeeeeaaaaeeeeeeeeeeeeaaa 115 6 3 1 Sortierte Collections u4ssnnnnnnnnnnnnnennnnnnnnnannnnnnnnnnnnnnnnnnnnnnnnnnn 115 6 3 2 Bidirektionale Assoziationen 24444snsnnnnnennnnnenennnnnnnnnnnnen nn 116 6 3 3
182. egionName oo 90 include all non lazy gt usage erforderlich bestimmt die Caching Strategie transactional read write nonstrict read write oder read only region optional defaults to the class or collection role name specifies the name of the second level cache region include optional defaults to all non lazy specifies that properties of the entity mapped with lazy true cannot be cached when attribute level lazy fetching is enabled Alternatively you can specify lt class cache gt and lt collection cache gt elements in hibernate cfg xml Das usage Attribut bestimmt eine Cache Nebenl ufigkeitsstrategie 271 Kapitel 20 Verbesserung der 20 2 2 Strategie read only If your application needs to read but not modify instances of a persistent class a read only cache can be used This is the simplest and optimal performing strategy It is even safe for use in a cluster lt class name eg Immutable mutable false gt lt cache usage read only gt lt class gt 20 2 3 Strategie read write If the application needs to update data a read write cache might be appropriate This cache strategy should never be used if serializable transaction isolation level is required If the cache is used in a JTA environment you must specify the property hibernate transaction manager_lookup_class and naming a strategy for obtaining the JTA Transact ionManager In other environment
183. ended to utilize either home grown ThreadLocal based contextual sessions helper classes such as HibernateUtil or utilized third party frameworks such as Spring or Pico which provided proxy interception based contextual sessions Starting with version 3 0 1 Hibernate added the sessionFactory getCurrentSession method Initially this assumed usage of sta transactions where the Ta transaction defined both the scope and context of a current session Given the maturity of the numerous stand alone JTA TransactionManager implementations most if not all applications should be using JTA transaction management whether or not they are deployed into a J2EE container Based on that the JTA based contextual sessions are all you need to use However as of version 3 1 the processing behind sessionFactory getCurrent Session is now pluggable To that end a new extension interface org hibernate context CurrentSessionContext and a new configuration parameter hibernate current_session_context_class have been added to allow pluggability of the scope and context of defining current sessions See the Javadocs for the org hibernate context CurrentSessionContext interface for a detailed discussion of its contract It defines a single method currentSession by which the implementation is responsible for tracking the current contextual session Out of the box Hibernate comes with three implementations of this interface org hibe
184. ennen nennen nennen 214 15 8 Polymorphe Anfragen serseri R nenn 214 15 9 Die where Klasel u Geena eels 215 15 10 Ausdr cke uu 2 20 0002000 aaa han aa aa ana na ann ade read Ha 217 15 11 Die Reihenfolge nach Klausel us444444Bnsnnn en nnnnnnennnnnnnennnnnnn nenn 221 15 12 Die Gruppe nach Klausel usussnnnnsnnnnnnnennnnnnnnnnnnnnennnnnnnnnnnnnnennnn 221 15 13 Unter nfragen u ana aan i a a ia eiaa RAS 222 15 14 HOL Belsplel niied di eines kei 223 15 15 Bulk Aktualisierung und L schen eessssssssssserrerssrrnneernrensrnrneennennsnnnneennens 225 19216 THOS S Tricks rn ee 225 15 17 Komponenten 2 een psd eel sauce 227 vii HIBERNATE Relational Persis 15 18 Die Syntax des Row Value Constructors 0 ccccceeeeeeeeeeeeeeeeeeeeaeaaenneneeeees 227 16 Criteria Queries ee ea beads amet adeeb cee 229 16 1 Creating a Criteria instance cc cece ce ceee cece cece eeeeeeeeeeeeaeaaeaeeeeeeeeeaeaaeaeeeees 229 16 2 Den Ergebnissatz eingrenzen uurssussnnnannnnnnnannnnnnnannnnnnnannnnnnnnnnnnenn nen 229 16 3 Die Ergebnisse ordnen ccc eeeececeeeeeeeee eter cena eeeeee nae eeeeaaeeeeeeaaaeeeeeaaeeeeeeaaeeees 230 16 4 ASsSO2lalloneN armer Meran apes Ga epoca ney 231 16 5 Dynamischer Assoziationsabruf 0 ccccceeeeeeeeeeeeeeeeeeeaeaaeeeeeeeeeeeeaeaaeaeeneeeees 232 16 6 Beispielanfragen 4444
185. ennnnnnnnnnnnnen nn 164 10 9 Objektreplikation zwischen zwei verschiedenen Datenspeichern 165 10 10 Das R umen der Session uuss4ssssssnnennnnnnnnnnnnnnennnnnnnnnnnnnnnennnnnnnnnnnnnnnnnn 165 10 11 Transitive Persistenz 242444nessnsnnnnnsnnnnnennnnnnnnnnnnnnnnnenennnnnnnnnnnnnen nn 167 10 12 Die Verwendung von Metadata 24444444Hnnnnnn nenn nnnnnnnnnnnnnn nn nnnn nn 168 11 Read only Entitles une 171 11 1 Making persistent entities read only us24s4nnnnsnnnnn nassen eee sean nnnnnnnn anne 171 11 1 1 Entities of immutable classes u ussnnsnsssenneneennnnnnnnnnnnenn anna 172 11 1 2 Loading persistent entities as read only ccecceeeeeeeeeeeeeeeeeeaeeeeeeees 172 11 1 3 Loading read only entities from an HQL query criteria eee 173 11 1 4 Making a persistent entity read only 2 00 0 cece eeeeee cece eee ee cena eeeeeeaaeeeeeeaa 174 11 2 Read only affect on property type uuunssssssssnnnenennnnnnnsnnnnnenennnnnnnnnnnnnen nn 175 11 212 Simple properties ssci2 etseeishs Mei neuen 176 11 2 2 Unidirectional ASSOCIATIONS 0 cece tee aa A N 177 11 2 3 Bidirectional ASSOCIATIONS uusnnnssennnnnnnnnnnnnnnnnnnnnnnn namen nnnnennnnn 179 12 Transactions and Concurrency 4444444444Hsnnnnnsnnnnnenennnnnnnnnnnnnnnennnnnnnnannnnnenn 181 vi 12 1 G ltigkeitsbereiche von Session
186. entifier 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 Abschnitt 5 1 5 Enhanced identifier generators support this operation 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 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 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 5 1 7 composite id lt composite id name propertyName class ClassName mapped true false access field property ClassName gt node element name lt key property name propertyName type typename column column_name gt lt key many to one name propertyName class ClassName column colu
187. entities from an HQL query criteria Session isDefaultReadOnly If Session isDefaultReadOnly returns true entities loaded by the following are automatically made read only Session load e Session get Session merge executing scrolling or iterating HQL queries and criteria to override this setting for a particular HQL query or criteria see Abschnitt 11 1 3 Loading read only entities from an HQL query criteria Changing this default has no effect on persistent entities already in the session when the default was changed e persistent entities that are refreshed via Session refresh a refreshed persistent entity will only be read only if it was read only before refreshing persistent entities added by the application via Session persist Session save and Session update Session saveOrUpdate 11 1 3 Loading read only entities from an HQL query criteria Anmerkung Entities of immutable classes are automatically loaded as read only If Session isDefaultReadOnly returns false the default when an HQL query or criteria executes then entities and proxies of mutable classes loaded by the query will not be read only You can override this behavior so that entities and proxies loaded by an HQL query or criteria are automatically made read only For an HQL query call Query setReadOnly true Query setReadOnly true must be called before Query list Query uniqueResult Query scro
188. er 20 5 3 Bags und Listen sind die effizientesten invertierten Collections There is a particular case however in which bags and also lists are much more performant than sets For a collection with inverse true the standard bidirectional one to many relationship idiom for example we can add elements to a bag or list without needing to initialize fetch the bag elements This is because unlike a set Collection add OfCollection addAll must always return true for a bag or List This can make the following common code much faster Parent p Parent sess load Parent class id Child c new Child c setParent p p getChildren add c no need to fetch the collection s ss flush 20 5 4 One Shot Loschung Deleting collection elements one by one can sometimes be extremely inefficient Hibernate knows not to do that in the case of an newly empty collection if you called 1ist clear for example In this case Hibernate will issue a single DELETE Suppose you added a single element to a collection of size twenty and then remove two elements Hibernate will issue one INSERT statement and two DELETE statements unless the collection is a bag This is certainly desirable Nehmen wir jedoch an wir entfernen 18 Elemente lie en also zwei brig und f gten dann drei weitere hinzu In diesem Fall gibt es zwei m gliche Vorgehensweisen die 18 Reihen eine nach der andere
189. er_id_seq lt param gt lt generator gt lt id gt lt property name name gt lt class gt lt class name Employment table employment_periods gt lt id name id gt lt generator class sequence gt lt param name sequence gt employment_id_seq lt param gt lt generator gt lt id gt lt property name startDate column start_date gt lt property name endDate column end_date gt lt component name hourlyRate class MonetaryAmount gt lt property name amount gt firstName String initial char lastName String getFirstNamed String setfirstNamel_firstName String getinitiald char setlnitiallinitialichan getLastNamed String setLastNamei_lastName String 303 Kapitel 24 Beispiel Verschi lt column name hourly_rate sql type NUMERIC 12 2 gt lt property gt lt property name currency length 12 gt lt component gt lt many to one name employer column employer_id not null true gt lt many to one name employee column employee_id not null true gt lt class gt lt class name Employee table employees gt lt id name id gt lt generator class sequence gt lt param name sequence gt employee_id_seq lt param gt lt generator gt lt id gt lt property name taxfileNumber gt lt component name name class Name gt lt property name firstName gt lt property name initial gt lt property na
190. ern von Daten eneren aiaa nz 251 18 1 Hibernate Filter 4 244440040444 E EE EERE EE REN 251 19 XML M ppINg a S 255 19 1 Das Arbeiten mit XML Daten u444444444 cece cece annnnnnnannnnnnnannnnnnnnnnnnnnn nenn 255 19 1 1 Spezifizierung des gemeinsamen Mappens von XML und Klasse 255 19 1 2 Spezifizierung des Mappens von nur XML unsssensssssssnnennnnnnnnnnnnn 256 19 2 XML Mapping Metadaten 444444444Hennnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn anna anne 256 19 3 Manipulation von XML Daten cece cece cette cree eater eeaa ee eeeeaaaeeeeeaaaeeeeeaaaeees 258 20 Verbesserung der Performance 44444444Hnnnnnn nn nnnnnnennnnnnnennnnnnnenn nenn 261 20 1 Abrufstrategien 4424444044annnnnnnnannnnnnnnnnnnnnnnnnnennnnnnnnnnnnnnennnnnnnnnnnnenenen 261 20 1 1 Der Umgang mit lazy Assoziationen usnnsseeennnnnnnnnnnnennnnnnnnennn 262 20 1 2 Abstimmung von Abrufstrategien usnnssesnnnsnnnnnnnnnnnnnnnnnnnnnnnnnnnen 262 20 1 3 Einendige Assoziationsproxies usunnssensnnnnnennnnnnnnnnnnnnnnn anne nn nnnnnnnn 263 20 1 4 Initialisierung von Collections und Proxies cceeeeeeeeeeeeeeeeeeeeneeeees 266 20 1 5 Die Verwendung von Stapelabruf Batch Fetching 267 20 1 6 Die Verwendung von Subselect Fetching s en 268 20 1 7 Fetch Profils een 268 viii
191. ernate sourceforge net hibernate configuration 3 0 dtd gt lt hibernate configuration gt lt a SessionFactory instance listed as jndi name gt lt session factory name java hibernate SessionFactory gt lt properties gt lt property name connection datasource gt java comp env jdbc MyDB lt property gt lt property name dialect gt org hibernate dialect MySQLDialect lt property gt lt property name show_sql gt false lt property gt lt property name transaction factory_class gt org hibernate transaction JTATransactionFactory lt property gt lt property name jta UserTransaction gt java comp UserTransaction lt property gt Sr Emepping fakes gt lt mapping resource org hibernate auction Item hbm xml gt lt mapping resource org hibernate auction Bid hbm xml gt cll Zeschessereingse lt class cache class org hibernate auction Item usage read write gt lt class cache class org hibernate auction Bid usage read only gt lt collection cache collection org hibernate auction Item bids usage read write gt lt session factory gt lt hibernate configuration gt The advantage of this approach is the externalization of the mapping file names to configuration The hibernate cfg xml is also more convenient once you have to tune the Hibernate cache It is your choice to use either hibernate properties Of hibernate cfg xml Both are equivalent except for the
192. erson JOIN ADDRESS address ON person ID address PERSON_ID AND address TYPE MAILING WHERE person NAME LIKE namePattern lt sql query gt 242 Benannte SQL Anfragen Eine benannte SQL Anfrage kann einen Skalarwert wiedergeben Sie m ssen unter Verwendung des lt return scalar gt Elements den Spalten Alias und den Hibernate Typ deklarieren lt sql query name mySqlQuery gt lt return scalar column name type string gt lt return scalar column age type long gt SELECT p NAME AS name p AGE AS age FROM PERSON p WHERE p NAME LIKE Hiber lt sql query gt You can externalize the resultset mapping information in a lt resultset gt element which will allow you to either reuse them across several named queries or through the setResultSetMapping API lt resultset name personAddress gt lt return alias person class eg Person gt lt return join alias address property person mailingAddress gt lt resultset gt lt sql query name personsWith resultset ref personAddress gt SELECT person NAME AS person name person AGE AS person age person SEX AS person sex address STREET AS address street address CITY AS address city address STATE AS address state address ZIP AS address zip FROM PERSON person JOIN ADDRESS address ON person ID address PERSON_ID AND address TYPE MAILING WHERE person NAME LIKE namePattern lt sql query gt You can alternatively use the
193. ert die auch in der SQL group by Klausel auftreten An alias can be assigned to a projection so that the projected value can be referred to in restrictions or orderings Here are two different ways to do this List results session createCriteria Cat class setProjection Projections alias Projections groupProperty color colr addorderit Order asc colr 233 Kapitel 16 Criteria Queries lt List results session createCriteria Cat class setProjection Projections groupProperty color as colr addOrder Order asc colr pabis 5 Die alias und as Methoden wrappen die Projektionsinstanzen in eine andere Alias Instanz von Projection Als Tastenk rzel k nnen Sie einen Alias zuordnen wenn Sie der Projektionsliste eine Projektion hinzuf gen List results session createCriteria Cat class setProjection Projections projectionList add Projections rowCount catCountByColor add Projections avg weight avgWeight add Projections max weight maxWeight add Projections groupProperty color color addOrder Order desc catCountByColor addOrder Order desc avgWeight o thie p List results session createCriteria Domestic class cat createAlias kittens kit setProjection Projections projectionList add Projections property cat name catName add Projections property kit name kitName
194. erty settings and return to immediate fetching F r die Bytecode Instrumentierung verwenden Sie folgende Ant Funktion lt target name instrument depends compile gt lt taskdef name instrument classname org hibernate tool instrument InstrumentTask gt lt classpath path jar path gt lt classpath path classes dir gt lt classpath refid lib class path gt lt taskdef gt lt instrument verbose true gt lt fileset dir testclasses dir org hibernate auction model gt lt include name class gt lt fileset gt lt instrument gt lt target gt A different way of avoiding unnecessary column reads at least for read only transactions is to use the projection features of HQL or Criteria queries This avoids the need for buildtime bytecode processing and is certainly a preferred solution You can force the usual eager fetching of properties using fetch all properties in HQL 20 2 Das Cache der zweiten Ebene A Hibernate session is a transaction level cache of persistent data It is possible to configure a cluster or JVM level SessionFactory level cache on a class by class and collection by collection basis You can even plug in a clustered cache Be aware that caches are not aware of changes made to the persistent store by another application They can however be configured to regularly expire cached data You have the option to tell Hibernate which caching implementation to use by specifying
195. et Handbuch Attribut Werte Bedeutung not null true false specifies that the column should be non nullable unique true false bestimmt dass die Spalte eine eindeutige Bedingung besitzt index index_name bestimmt den Namen eines mehrspaltigen Index unique key unique_key_name bestimmt den Namen einer mehrspaltigen eindeutigen Bedingung foreign key foreign_key_name legt den Namen einer Bedingung des Fremdschl ssels fest der f r eine Assoziation generiert wurde f r ein lt one to one gt lt many to one gt lt key gt Oder lt many to many gt Mapping Element Bitte beachten Sie dass inverse true Seiten beim SchemaExport nicht ber cksichtigt werden sql type SQL column type setzt den Standard Spaltentyp au er Kraft nur Attribut von lt column gt Element default SQL Ausdruck bestimmt einen Standardwert f r die Spalte check SQL Ausdruck erstellt eine SQL berpr fungsbedingung an entweder der Spalte oder der Tabelle Das lt comment gt Element erlaubt die Bestimmung von Kommentaren f r das generierte Schema lt class name Customer table CurCust gt lt comment gt Current customers only lt comment gt lt class gt lt property name balance gt lt column name bal gt lt comment gt Balance in USD lt comment gt lt column gt lt property gt This results in a comment on table Of comment on column statement in the generated DDL where supported 284 St
196. eturn true if other instanceof Cat return false final Cat cat Cat other 56 Dynamische Modelle if cat getLitterId equals getLitterId return false if cat getMother equals getMother return false return true public int hashCode int result result getMother hashCode result 29 result getLitterId return result A business key does not have to be as solid as a database primary key candidate see Abschnitt 12 1 3 Die Ber cksichtigung der Objektidentitat Immutable or unique properties are usually good candidates for a business key 4 4 Dynamische Modelle 5 Note The following features are currently considered experimental and may change in the near future Persistent entities do not necessarily have to be represented as POJO classes or as JavaBean objects at runtime Hibernate also supports dynamic models using Maps of Maps at runtime and the representation of entities as DOM4J trees With this approach you do not write persistent classes only mapping files By default Hibernate works in normal POJO mode You can set a default entity representation mode for a particular SessionFactory using the default_entity_mode configuration option see Tabelle 3 3 Konfigurationseigenschaften von Hibernate The following examples demonstrate the representation using Maps First in the mapping file an entity name has to be declared instead of or
197. f a persistent object before it is saved updated deleted or loaded One possible use for this is to track auditing information For example the following Interceptor automatically sets the createTimestamp when an Auditable is created and updates the lastUpdateTimestamp property when an Auditable is updated You can either implement Interceptor directly or extend EmptyInterceptor package org import import import import import import java java java hibernate test io Serializable util Date util Iterator org hibernate EmptyInterceptor org hibernate Transaction org hibernate type Type public class AuditInterceptor extends EmptyInterceptor private int updates private int creates private int loads public void onDelete Object entity Serializable id Object state String propertyNames Type types il de nething public boolean onFlushDirty Object entity IE Serializable id Object currentState Object previousState String propertyNames Type types entity instanceof Auditable updatest for int i 0 i lt propertyNames length itr if lastUpdateTimestamp equals propertyNames i currentState i new Date return true 197 Kapitel 13 Interzeptoren und return false public boolean onLoad Object entity Serializable id Object state String propertyNames Type types if entity insta
198. fied in the mapping document This can be problematic for SQL queries that join multiple tables since the same column names can appear in more than one table Spalten Alias Einspeisung wird bei der folgenden Anfrage ben tigt die aller Wahrscheinlichkeit nach fehlschlagen wird sess createSQLQuery SELECT c m FROM CATS c CATS m WHERE c MOTHER_ID c ID addEntity cat Cat class addEntity mother Cat class The query was intended to return two Cat instances per row a cat and its mother The query will however fail because there is a conflict of names the instances are mapped to the same column names Also on some databases the returned column aliases will most likely be on the form c ID c NAME etc which are not equal to the columns specified in the mappings ID and NAME Die folgende Form ist nicht anf llig f r die Duplizierung von Spaltennamen 239 Kapitel 17 Native SQL sess createSQLQuery SELECT cat mother FROM CATS c CATS m WHERE c MOTHER_ID c ID addEntity cat Cat class addEntity mother Cat class Diese Anfrage spezifiziert der SQL Anfragen String mit Platzhaltern f r die durch Hibernate eingespeisten Aliasse die von der Anfrage erhaltenen Entities The cat and mother notation used above is a shorthand for all properties Alternatively you can list the columns explicitly but even in this case Hibernate injects the SQL column aliases for each pr
199. ften useful for lt one to one gt and lt one to many gt associations 167 Kapitel 10 Das Arbeiten mit If the child object s lifespan is bounded by the lifespan of the parent object make it a life cycle object by specifying cascade all delete orphan Andernfalls wird keine Weitergabe ben tigt Wenn Sie jedoch glauben dass Sie oft mit ber und untergeordneten Objekten in derselben Transaktion arbeiten werden und Sie sich etwas Tipparbeit sparen m chten so k nnen Sie cascade persist merge save update verwenden Das Mappen einer Assoziation entweder einer einwertigen Assoziation oder einer Collection unter Verwendung von cascade all kennzeichnet die Assoziation als zum Parent Child Beziehungstyp geh rig bei dem Speichern Aktualisieren L schen des bergeordneten Objekts zum Speichern Aktualisieren L schen des untergeordneten Objekts oder Objekte f hrt Furthermore a mere reference to a child from a persistent parent will result in save update of the child This metaphor is incomplete however A child which becomes unreferenced by its parent is not automatically deleted except in the case of a lt one to many gt association mapped with cascade delete orphan The precise semantics of cascading operations for a parent child relationship are as follows Falls f r einen Parent persist gilt so gilt f r s mtliche Children ebenfalls persist Falls f r einen Parent merge gilt so gilt
200. g getText return _text public String getTitle return _title public void setBlog Blog blog _blog blog public void setDatetime Calendar calendar _datetime calendar public void setId Long longl id longl public void setText String string _text string public void setTitle String string _title string 23 2 Hibernate Mappings The XML mappings are now straightforward For example lt xml version 1 0 gt lt DOCTYPE hibernate mapping PUBLIC Hibernate Hibernate Mapping DTD 3 0 EN http hibernate sourceforge net hibernate mapping 3 0 dtd gt lt hibernate mapping package eg gt lt class name Blog table BLOGS gt lt id name id column BLOG_ID gt lt generator class native gt lt id gt lt property name name column NAME not null true unique true gt 296 Hibernate Mappings lt bag name items inverse true order by DATE_TIME cascade all gt lt key column BLOG_ID gt lt one to many class BlogItem gt lt bag gt lt class gt lt hibernate mapping gt lt xml version 1 0 gt lt DOCTYPE hibernate mapping PUBLIC Hibernate Hibernate Mapping DTD 3 0 EN http hibernate sourceforge net hibernate mapping 3 0 dtd gt lt hibernate mapping package eg gt lt elass name BlogItem table BLOG_ITEMS dynamic update true gt lt id name id colu
201. g that alias If the entity name is not aliased then it is illegal for any property references to be qualified No joins either implicit or explicit can be specified in a bulk HQL query Sub queries can be used in the where clause where the subqueries themselves may contain joins Die where Klausel ist ebenfalls optional As an example to execute an HQL UPDATE use the Query executeUpdate method The method is named for those familiar with JDBC s PreparedStatement executeUpdate 205 Kapitel 14 Batch Verarbeitung Session session sessionFactory openSession Transaction tx session beginTransaction String hqlUpdate update Customer c set c name newName where c name oldName or String hqlUpdate update Customer set name newName where name oldName int updatedEntities s createQuery hqlUpdate setString newName newName setString oldName oldName executeUpdate Gx committe i i session close In keeping with the EJB3 specification HQL UPDATE statements by default do not effect the version or the timestamp property values for the affected entities However you can force Hibernate to reset the version Or timestamp property values through the use of a versioned update This is achieved by adding the versIonen keyword after the UPDATE keyword Session session sessionFactory openSession Transaction tx session beginTransaction
202. ge Assoziationsproxies Lazy fetching for collections is implemented using Hibernate s own implementation of persistent collections However a different mechanism is needed for lazy behavior in single ended associations The target entity of the association must be proxied Hibernate implements lazy 263 Kapitel 20 Verbesserung der initializing proxies for persistent objects using runtime bytecode enhancement which is accessed via the CGLIB library At startup Hibernate3 generates proxies by default for all persistent classes and uses them to enable lazy fetching of many to one and one to one associations The mapping file may declare an interface to use as the proxy interface for that class with the proxy attribute By default Hibernate uses a subclass of the class The proxied class must implement a default constructor with at least package visibility This constructor is recommended for all persistent classes There are potential problems to note when extending this approach to polymorphic classes For example lt class name Cat proxy Cat gt lt subclass gt lt class gt Zun chst einmal werden Instanzen von cat hinsichtlich ihres Datentyps niemals in Domest icCat konvertierbar sein selbst wenn die zu Grunde liegende Instanz eine Instanz von Domesticcat ist Cat cat Cat session load Cat class id instantiate a proxy does not hit the db if cat isDomesticCat hit the db to initialize t
203. gt lt component gt lt subclass name Employee discriminator value E gt lt property name title length 20 gt lt property name salary gt lt many to one name manager gt lt subclass gt lt subclass name Customer discriminator value C gt lt property name comments gt lt many to one name salesperson gt lt subclass gt elass gt ell 24 4 5 Assoziationen bei wechselnden Schl sseln lt class name Person gt lt id name id gt lt generator class hilo gt lt id gt lt property name name length 100 gt lt one to one name address property ref person cascade all fetch join gt 313 Kapitel 24 Beispiel Verschi lt set name accounts inverse true gt lt key column userId property ref userId gt lt one to many class Account gt lt set gt lt property name userId length 8 gt lt class gt lt class name Address gt lt id name id gt lt generator class hilo gt lt id gt lt property name address length 300 gt lt property name zip length 5 gt lt property name country length 25 gt lt many to one name person unique true not null true gt lt class gt lt class name Account gt lt id name accountId length 32 gt lt generator class uuid gt lt i gt lt many to one name user column userId property ref userId gt lt property name
204. gt lt id gt lt one to one name employee class Employee constrained true gt lt class gt A newly saved instance of Person is assigned the same primary key value as the Employee instance referred with the employee property of that Person Alternatively a foreign key with a unique constraint from Employee to Person can be expressed as lt many to one name person class Person column PERSON_ID unique true gt 85 Kapitel 5 Grundlagen des O R This association can be made bidirectional by adding the following to the Person mapping lt one to one name employee class Employee property ref person gt 5 1 14 Natural id lt natural id mutable true false gt lt property gt lt many to one gt lt natural id gt 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 ofthe natural key inside the lt natural id gt element Hibernate will generate the necessary unique key and nullability constraints and as a result your mapping will be more self documenting It is recommended that you implement equals and hashCode to compare the natural key properties of the entity This mapping is not intended for use with entities that have natural primary keys mutable op
205. gth locate abs sqrt bit_length mod e coalesce und nullif e str zur Konvertierung numerischer oder tempor rer Werte in einen lesbaren String cast as Wo ein zweites Argument der Name eines Hibernate Typs ist und extract from wenn ANSI cast und extract von der zu Grunde liegenden Datenbank unterst tzt werden die HQL index Funktion die f r Aliasse eine verbundenen indizierten Collection gilt e HQL functions that take collection valued path expressions size minelement maxelement minindex maxindex along with the special elements and indices functions that can be quantified using some all exists any in Any database supported SQL scalar function like sign trunc rtrim and sin e Positionelle Parameter im JDBC Stil 2 217 Kapitel 15 HQL Die Hiberna named parameters name start_date and x1 e SQL Literale foo 69 6 66E 2 1970 01 01 10 00 01 0 e Java public static final Konstanten eg Color TABBY in and between can be used as follows from DomesticCat cat where cat name between A and B from DomesticCat cat where cat name in Foo Bar Baz The negated forms can be written as follows from DomesticCat cat where cat name not between A and B from DomesticCat cat where cat name not in Foo Bar Baz Similarly is null and is not null can be used to test for null values Booleans can be
206. h good ordered by their mate s age and all cats who do not have a mate This is useful when there is a need to order or limit in the database prior to returning complex large result sets and removes many instances where multiple queries would have to be performed and the results unioned by java in memory Without this feature first all of the cats without a mate would need to be loaded in one query A second query would need to retreive the cats with mates who s name started with good sorted by the mates age Thirdly in memory the lists would need to be joined manually 16 5 Dynamischer Assoziationsabruf You can specify association fetching semantics at runtime using setFetchMode List cats sess createCriteria Cat class add Restrictions like name Fritz setFetchMode mate FetchMode EAGER setFetchMode kittens FetchMode EAGER ESEO This query will fetch both mate and kittens by outer join See Abschnitt 20 1 Abrufstrategien for more information 16 6 Beispielanfragen Mit der Klasse org hibernate criterion Example k nnen Sie ein Anfragenkriterium aus einer gegebenen Instanz zu konstruieren Cat cat new Cat cat setSex F cat setColor Color BLACK List results session createCriteria Cat class add Example create cat odlatine A Versions Properties Bezeichner und Assoziationen werden bergangen In der Standardeinstellung werden auch Properties mit dem Wert
207. h some properties package org hibernate tutorial domain import java util Date public class Event private Long id private String title private Date date public Event public Long getId return id private void setId Long id enhisiad nid public Date getDate return date public void setDate Date date this date date Kapitel 1 Tutorial public String getTitle return title public void setTitle String title this title title This class uses standard JavaBean naming conventions for property getter and setter methods as well as private visibility for the fields Although this is the recommended design it is not required Hibernate can also access fields directly the benefit of accessor methods is robustness for refactoring The id property holds a unique identifier value for a particular event All persistent entity classes there are less important dependent classes as well will need such an identifier property if we want to use the full feature set of Hibernate In fact most applications especially web applications need to distinguish objects by identifier so you should consider this a feature rather than a limitation However we usually do not manipulate the identity of an object hence the setter method should be private Only Hibernate will assign identifiers when an object is saved Hibernate can access public private and protected accessor
208. hanged slightly once the implication of this was better understood so that the insert is delayed in cases where that is feasible The underlying issue is that the actual semanctics of the application itself changes in these cases Starting with version 3 2 3 Hibernate comes with a set of enhanced http in relation to 2082 lace identifier generators targetting portability in a much different way 3 Anmerkung There are specifically 2 bundled enhancedgenerators org hibernate id enhanced SequenceStyleGenerator org hibernate id enhanced TableGenerator The idea behind these generators is to port the actual semantics of the identifer value generation to the different databases For example the org hibernate id enhanced SequenceStyleGenerator mimics the behavior of a sequence on databases which do not support sequences by using a table 320 Database functions 26 5 Database functions Warnung This is an area in Hibernate in need of improvement In terms of portability concerns this function handling currently works pretty well from HQL however it is quite lacking in all other aspects SQL functions can be referenced in many ways by users However not all databases support the same set of functions Hibernate provides a means of mapping a logical function name to a delegate which knows how to render that particular function perhaps even using a totally different physical function call Wichtig T
209. hanges persistent session update entity now entity is no longer read only and its changes can be flushed se Trash 11 2 Read only affect on property type The following table summarizes how different property types are affected by making an entity read only Tabelle 11 1 Affect of read only entity on property types Property Association Type Changes flushed to DB Simple no 175 Kapitel 11 Read only entities Property Association Type Abschnitt 11 2 1 Simple properties Unidirectional one to one Unidirectional many to one Abschnitt 11 2 2 1 Unidirectional one to one and many to one Unidirectional one to many Unidirectional many to many Abschnitt 11 2 2 2 Unidirectional one to many and many to many Bidirectional one to one Abschnitt 11 2 3 1 Bidirectional one to one Changes flushed to DB no no yes yes only if the owning entity is not read only Bidirectional one to many many to one inverse collection non inverse collection Abschnitt 11 2 3 2 many many to one Bidirectional one to Bidirectional many to many Abschnitt 11 2 3 3 Bidirectional many to many only added removed entities that are not read only yes yes Behavior is different when the entity having the property association is read only compared to when it is not read only 11 2 1 Simple properties When a persistent object
210. hat subclass is mapped but also the root table and potentially joined subclass tables further down the inheritance hierarchy Die Pseudo Syntax f r INSERT Anweisungen lautet INSERT INTO EntityName properties_list select_statement Hierzu einige wichtige Punkte Nur INSERT INTO SELECT wird unterst tzt nicht jedoch INSERT INTO VALUES The properties_list is analogous to the column specification in the SQL INSERT statement For entities involved in mapped inheritance only properties directly defined on that given class level can be used in the properties list Superclass properties are not allowed and subclass properties do not make sense In other words INSERT statements are inherently non polymorphic select_statement can be any valid HQL select query with the caveat that the return types must match the types expected by the insert Currently this is checked during query compilation rather than allowing the check to relegate to the database This might however cause problems between Hibernate Types which are equivalent as opposed to equal This might cause issues with mismatches between a property defined as a org hibernate type DateType and a property defined as a org hibernate type TimestampType even though the database might not make a distinction or might be able to handle the conversion For the id property the insert statement gives you two options You can either explicitly specify t
211. he Transaction and close the Session If you do not do this Hibernate cannot guarantee that in memory state accurately represents the persistent state For example do not use Session load to determine if an instance with the given identifier exists on the database use Session get or a query instead Prefer lazy fetching for associations Use eager fetching sparingly Use proxies and lazy collections for most associations to classes that are not likely to be completely held in the second level cache For associations to cached classes where there is an a extremely high probability of a cache hit explicitly disable eager fetching using lazy false When join fetching is appropriate to a particular use case use a query with a left join fetch Use the open session in view pattern or a disciplined assembly phase to avoid problems with unfetched data Hibernate frees the developer from writing tedious Data Transfer Objects DTO In a traditional EJB architecture DTOs serve dual purposes first they work around the problem that entity beans are not serializable second they implicitly define an assembly phase where 316 all data to be used by the view is fetched and marshalled into the DTOs before returning control to the presentation tier Hibernate eliminates the first purpose Unless you are prepared to hold the persistence context the session open across the view rendering process you will still need an assembly phase Think of
212. he associated entity or collection of value type 256 XML Mapping Metadaten will be embedded directly in the XML tree for the entity that owns the association Otherwise if mbed xml false then only the referenced identifier value will appear in the XML for single point associations and collections will not appear at all Do not leave embed xml true for too many associations since XML does not deal well with circularity lt class name Customer table CUSTOMER node customer gt lt id name id column CUST_ID node id gt lt map name accounts node embed xml true gt lt key column CUSTOMER_ID not null true gt lt map key column SHORT_DESC node short desc type string gt lt one to many entity name Account embed xml false node account gt lt map gt lt component name name node name gt lt property name firstName node first name gt lt property name initial node initial gt lt property name lastName node last name gt lt component gt lt class gt In this case the collection of account ids is embedded but not the actual account data The following HQL query from Customer c left join fetch c accounts where c lastName like lastName would return datasets such as this lt customer id 123456789 gt 257 Kapitel 19 XML Mapping lt account short desc Savings gt 987632567 lt account gt lt
213. he id property in the properties_list in which case its value is taken from the corresponding select expression or omit it from the properties_list in which case a generated value is used This latter option is only available when using id generators that operate in the database attempting to use this option with any in memory type generators will cause an exception during parsing For the purposes of this discussion in database generators are considered to be org hibernate id SequenceGenerator and its subclasses and any implementers of org hibernate id PostInsertIdentifierGenerator The most notable exception here is org hibernate id TableHiLoGenerator which cannot be used because it does not expose a selectable way to get its values For properties mapped as either version Or timestamp the insert statement gives you two options You can either specify the property in the properties_list in which case its value is taken from the corresponding select expressions or omit it from the properties _list in which case the seed value defined by the org hibernate type VersionType IS used The following is an example of an HQL INSERT statement execution Session session sessionFactory openSession Transaction tx session beginTransaction String hqglInsert insert into DelinquentAccount id name select c id c name from Customer e where int createdEntities s createQuery hqlInsert executeUpdate tx commit
214. he proxy DomesticCat dc DomesticCat cat fy Error Secondly it is possible to break proxy Cat cat Cat session load Cat class id instantiate a Cat proxy DomesticCat dc DomesticCat session load DomesticCat class id acquire new DomesticCat proxy System out println cat dc alse Allerdings ist die Situation nicht so schlimm wie sie aussieht Obwohl wir jetzt zwei Verweise auf verschiedene Proxy Objekte besitzen so bleibt die zu Grunde liegende Instanz nach wie vor dasselbe Objekt cat setWeight 11 0 hit the db to initialize the proxy System out printin dce getWeight 11 0 264 Einendige Assoziationsproxies Third you cannot use a CGLIB proxy for a final class or a class with any final methods Finally if your persistent object acquires any resources upon instantiation e g in initializers or default constructor then those resources will also be acquired by the proxy The proxy class is an actual subclass of the persistent class These problems are all due to fundamental limitations in Java s single inheritance model To avoid these problems your persistent classes must each implement an interface that declares its business methods You should specify these interfaces in the mapping file where cat Imp1 implements the interface cat and DomesticCatImp1 implements the interface Domesticcat For example lt class name Cat Impl proxy_ Cat gt lt subclass gt lt clas
215. he row 12 4 Pessimistic locking It is not intended that users spend much time worrying about locking strategies It is usually enough to specify an isolation level for the JDBC connections and then simply let the database do all the work However advanced users may wish to obtain exclusive pessimistic locks or re obtain locks at the start of a new transaction Hibernate will always use the locking mechanism of the database it never lock objects in memory The LockMode class defines the different lock levels that can be acquired by Hibernate A lock is obtained by the following mechanisms LockMode WRITE wird automatisch erlangt wenn Hibernate eine Reihe aktualisiert oder einf gt PGRADE can be acquired upon explicit user request using SELECT FOR UPDATE e LockMode U on databases which support that syntax U PGRADE_NOWAIT can be acquired upon explicit user request using a SE FOR UPDATE NOWAIT under Oracle j T Q 4 e LockMode LockMode READ is acquired automatically when Hibernate reads data under Repeatable Read or Serializable isolation level It can be re acquired by explicit user request e LockMode NONE repr sentiert das Fehlen einer Sperre Alle Objekte wechseln am Ende einer Transaction in diesen Sperrmodus Objekte die durch Aufruf von update oder saveOrUpdate der Session zugeordnet werden starten ebenfalls in diesem Sperr
216. his chapter provides an step by step introduction to Hibernate starting with a simple application using an in memory database The tutorial is based on an earlier tutorial developed by Michael Gloegl All code is contained in the tutorials web directory of the project source Wichtig This tutorial expects the user have knowledge of both Java and SQL If you have a limited knowledge of JAVA or SQL it is advised that you start with a good introduction to that technology prior to attempting to learn Hibernate Anmerkung The distribution contains another example application under the tutorial eg project source directory 1 1 Teil 1 Die erste Hibernate Anwendung For this example we will set up a small database application that can store events we want to attend and information about the host s of these events Anmerkung 4 Although you can use whatever database you feel comfortable using we will use http nsqldb org an in memory Java database to avoid describing installation setup of any particular database servers 1 1 1 Setup The first thing we need to do is to set up the development environment We will be using the standard layout advocated by alot of build tools such as Maven http maven org Maven in particular has a good resource describing this ayout http maven apache org guides introduction introduction to the standard directory layout html As this tutorial is to be a web application we will be c
217. ho are used to the auto commit mode Always use clear transaction boundaries even for read only operations Depending on your isolation level and database capabilities this might not be required but there is no downside if you always demarcate transactions explicitly Certainly a single database transaction is going to perform better than many small transactions even for reading data A Hibernate application can run in non managed i e standalone simple Web or Swing applications and managed J2EE environments In a non managed environment Hibernate is usually responsible for its own database connection pool The application developer has to manually set transaction boundaries begin commit or rollback database transactions themselves A managed environment usually provides container managed transactions CMT with the transaction assembly defined declaratively in deployment descriptors of EJB session beans for example Programmatic transaction demarcation is then no longer necessary However it is often desirable to keep your persistence layer portable between non managed resource local environments and systems that can rely on JTA but use BMT instead of CMT In both cases use programmatic transaction demarcation Hibernate offers a wrapper API called Transaction that translates into the native transaction system of your deployment environment This API is actually optional but we strongly encourage its use unless you are in a CMT sess
218. htig If you define a set of composite elements it is important to implement equals and hashCode correctly Composite elements can contain components but not collections If your composite element contains components use the lt nested composite element gt tag This case is a collection of components which themselves have components You may want to consider if a one to many association is more appropriate Remodel the composite element as an entity but be aware that even though the Java model is the same the relational model and persistence semantics are still slightly different A composite element mapping does not support null able properties if you are using a lt set gt There is no separate primary key column in the composite element table Hibernate uses each column s value to identify a record when deleting objects which is not possible with null values You have to either use only not null properties in a composite element or choose a lt list gt lt map gt lt bag gt Or lt idbag gt A special case of a composite element is a composite element with a nested lt many to one gt element This mapping allows you to map extra columns of a many to many association table to the composite element class The following is a many to many association from order to Item where purchaseDate price and quantity are properties of the association 139 Kapitel 8 Komponenten Mapping lt class name eg Order sr lt se
219. ial JDK Proxy InvocationHandler implementation where we proxy an interface as the domain model and simply store persistent state in an internal Map This is an extremely trivial example meant only for illustration 60 EntityNameResolvers Bgl public final class DataProxyHandler implements InvocationHandler private String entityName private HashMap data new HashMap public DataProxyHandler String entityName Serializable id this entityName entityName data put id idii public Object invoke Object proxy Method method Object args throws Throwable String methodName method getName if methodName startsWith set String propertyName methodName substring 3 data put propertyName args 0 else if methodName startsWith get String propertyName methodName substring 3 return data get propertyName else if toString equals methodName return entityName data get Id else if hashCode equals methodName return new Integer this hashCode return null public String getEntityName return entityName public HashMap getData return data Ay public class ProxyHelper public static String extractEntityName Object object Our custom java lang reflect Proxy instances actually bundle their appropriate entity name so we simply extract it from there if this represents one of our proxies otherwise
220. iation von Parent ZU Child beginnen lt set name children gt lt key column parent_id gt lt one to many class Child gt lt set gt If we were to execute the following code 289 Kapitel 22 Beispiel Parent Parent D 40508 8 Child c new Child p getChildren add c session save c session flush so wurde Hibernate zwei SQL Anweisungen herausgeben ein INSERT um den Datensatz f r c zu erstellen ein UPDATE um die Verbindung von p zuc Zu erstellen This is not only inefficient but also violates any NOT NULL constraint on the parent_id column You can fix the nullability constraint violation by specifying not null true in the collection mapping lt set name children gt lt key column parent_id not null true gt lt one to many class Child gt lt set Dieses ist jedoch nicht die empfohlene L sung The underlying cause of this behavior is that the link the foreign key parent_id from p to c is not considered part of the state of the child object and is therefore not created in the INSERT The solution is to make the link part of the child mapping lt many to one name parent column parent_id not null true gt You also need to add the parent property to the child class Now that the child entity is managing the state of the link we tell the collection not to update the link We use the inverse attribute to do this lt set name chil
221. ibernate Wiki for examples 12 3 3 Abgesetzte Objekte und automatische Versionierung Jede Interaktion mit dem persistenten Speicher geschieht in einer neuen session Allerdings werden dieselben persistenten Instanzen f r jede Interaktion mit der Datenbank wiederverwendet Die Anwendung manipuliert den Status der abgesetzten Instanzen die urspr nglich in einer anderen session geladen wurden und f gt diese mittels Session update Session saveOrUpdate Oder Session merge erneut hinzu foo is an instance loaded by a previous Session foo setProperty bar session factory openSession Transaction t session beginTransaction session saveOrUpdate foo Use merge if foo might have been loaded already teen session close Again Hibernate will check instance versions during flush throwing an exception if conflicting updates occurred You can also call lock instead of update and use LockMode READ performing a version check and bypassing all caches if you are sure that the object has not been modified 12 3 4 Anpassung der automatischen Versionierung You can disable Hibernate s automatic version increment for particular properties and collections by setting the optimistic lock mapping attribute to false Hibernate will then no longer increment versions if the property is dirty Legacy database schemas are often static and cannot be modified Or other applications might access the same databa
222. ied classname of the type View org hibernate test DoubleStringType to see the kind of things that are possible lt property name twoStrings type org hibernate test DoubleStringType gt lt column name first_string gt lt column name second_string gt lt property gt Beachten Sie die Verwendung von lt column gt Tags beim Mappen einer Property zu mehreren Spalten 98 Das mehrfache Mappen einer Klasse Die CompositeUserType EnhancedUserType UserCollectionType UNd UserVersionType Interfaces unterst tzen auch speziellere Einsatzm glichkeiten You can even supply parameters to a 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 lt type gt element in your mapping files lt property name priority gt lt type name com mycompany usertypes DefaultValueIntegerType gt lt param name default gt 0 lt param gt lt type gt lt property gt Der UserType kann jetzt den Wert f r den Parameter mit Namen default von dem an ihn geleiteten Properties Objekt abrufen If you regularly use a certain UserType it is useful to define a shorter name for it You can do this using the lt typedef gt element Typedefs assign a name to a custom type and can also contain a list of default parameter values if the type is parameterized lt typedef class com mycompany
223. ifies which operations should be cascaded from the parent object to the associated object fetch optional defaults t0 select chooses between outer join fetching or sequential select fetching update insert optional defaults to true specifies that the mapped columns should be included in SQL uppaTE 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 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 access optional defaults to property the strategy Hibernate uses for accessing the property value 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 not null optional enables the DDL generation of a nullability constraint for the foreign key columns 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 lazy optional defaults to proxy by default single point associations are proxied lazy no proxy specifies that the
224. igher value than the timeouts of any of the query caches In fact we recommend that the the UpdateTimestampsCache region not be configured for expiry at all Note in particular that an LRU cache expiry policy is never appropriate As mentioned above most queries do not benefit from caching or their results So by default individual queries are not cached even after enabling query caching To enable results caching for a particular query call org hibernate Query setCacheable true This call allows the query to look for existing cache results or add its results to the cache when it is executed Anmerkung The query cache does not cache the state of the actual entities in the cache it caches only identifier values and results of value type For this reaso the query 275 Kapitel 20 Verbesserung der cache should always be used in conjunction with the second level cache for those entities expected to be cached as part of a query result cache just as with collection caching 20 4 2 Query cache regions If you require fine grained control over query cache expiration policies you can specify a named cache region for a particular query by calling Query setCacheRegion List blogs sess createQuery from Blog blog where blog blogger blogger setEntity blogger blogger setMaxResults 15 setCacheable true setCacheRegion frontpages alise y If you want to force the query cache to refresh o
225. imary key id 308 Verschiedene Beispiele von Mappings alter table orders add constraint ordersFKO foreign key customer_id references customers alter table line _items add constraint line_itemsFKO foreign key product_id references products alter table line _ items add constraint line_itemsFK1 foreign key order_id references orders 24 4 Verschiedene Beispiele von Mappings These examples are available from the Hibernate test suite You will find many other useful example mappings there by searching in the test folder of the Hibernate distribution 24 4 1 Typisierte One to One Assoziation lt class name Person gt lt id name name gt lt one to one name address cascade all gt lt formula gt name lt formula gt lt formula gt HOME lt formula gt lt one to one gt lt one to one name mailingAddress cascade all gt lt formula gt name lt formula gt lt formula gt MAILING lt formula gt lt one to one gt lt class gt lt class name Address batch size 2 check addressType in MAILING HOME BUSINESS gt lt composite id gt lt key many to one name person column personName gt lt key property name type column addressType gt lt composite id gt lt property name street type text gt lt property name state gt lt property name zip gt lt class gt 24 4 2 Beispiel f r einen zusammengesetzten Schl ssel lt class name Cust
226. in key and many to many swap in both mapping documents The most important addition here is the inverse true attribute in the set element of the Event s collection mapping What this means is that Hibernate should take the other side the Person class when it needs to find out information about the link between the two This will be a lot easier to understand once you see how the bi directional link between our two entities is created 1 2 6 Die Bearbeitung bidirektionaler Verbindungen First keep in mind that Hibernate does not affect normal Java semantics How did we create a link between a Person and an Event in the unidirectional example You add an instance of Event to the collection of event references of an instance of Person If you want to make this link bi directional you have to do the same on the other side by adding a Person reference to the collection in an Event This process of setting the link on both sides is absolutely necessary with bi directional links Many developers program defensively and create link management methods to correctly set both sides for example in Person protected Set getEvents return events protected void setEvents Set events this events events public void addToEvent Event event this getEvents add event event getParticipants add this public void removeFromEvent Event event this getEvents remove event event getParticipants remo
227. in cat mother as mother where cat name setString 0 name TESEO List kittens session createQuery from Cat as cat where cat mother setEntity 0 pk ERS Cat mother Cat session createQuery select cat m ther from Cat as cat where cat 7 setEntity 0 izi uniqueResult Query mothersWithKittens Cat session createQuery select mother from Cat as mother left join fetch mother kittens Set uniqueMothers new HashSet mothersWithKittens list A query is usually executed by invoking list The result of the query will be loaded completely into a collection in memory Entity instances retrieved by a query are in a persistent state The uniqueResult method offers a shortcut if you know your query will only return a single object 156 Ausf hren von Anfragen Queries that make use of eager fetching of collections usually return duplicates of the root objects but with their collections initialized You can filter these duplicates through a Set 10 4 1 1 Iterationsergebnisse Occasionally you might be able to achieve better performance by executing the query using the iterate method This will usually be the case if you expect that the actual entity instances returned by the query will already be in the session or second level cache If they are not already cached iterate willbe slower than list and might require many database hits for a simple query usually 7 for the initia
228. in that by way of an example Say we have the following mappings lt hibernate mapping gt lt class name Customer gt lt set name orders inverse true gt lt key column cust_id gt lt one to many class Order gt lt set gt lt class gt lt class name Order gt lt class gt lt hibernate mapping gt Now normally when you get a reference to a particular customer that customer s set of orders will be lazy meaning we will not yet have loaded those orders from the database Normally this is a good thing Now lets say that you have a certain use case where it is more efficient to load the customer and their orders together One way certainly is to use dynamic fetching strategies via an HQL or criteria queries But another option is to use a fetch profile to achieve that Just add the following to your mapping lt hibernate mapping gt lt fetch profile name customer with orders gt lt fetch entity Customer association orders style join gt lt fetch profile gt lt hibernate mapping 268 Die Verwendung von Lazy Property Fetching or even lt hibernate mapping gt lt class name Customer gt lt fetch profile name customer with orders gt lt fetch association orders style join gt lt fetch profile gt lt class gt lt hibernate mapping gt Now the following code will actually load both the customer and their orders Session session sessio
229. in three categories e Mit dem allgemeinen session Gebrauch zusammenh ngende Metriken wie etwa die Anzahl ge ffneter Sessions abgerufener JDBC Verbindungen usw 279 Kapitel 20 Verbesserung der e Metrics related to the entities collections queries and caches as a whole aka global metrics Detaillierte Metriken die sich auf eine bestimmte Entity Collection Anfrage oder Cache Region beziehen For example you can check the cache hit miss and put ratio of entities collections and queries and the average time a query needs Be aware that the number of milliseconds is subject to approximation in Java Hibernate is tied to the JVM precision and on some platforms this might only be accurate to 10 seconds Simple getters are used to access the global metrics i e not tied to a particular entity collection cache region etc You can access the metrics of a particular entity collection or cache region through its name and through its HQL or SQL representation for queries Please refer to the Statistics EntityStatistics CollectionStatistics SecondLevelCacheStatistics and QueryStatistics API Javadoc for more information The following code is a simple example Statistics stats HibernateUtil sessionFactory getStatistics double queryCacheHitCount stats getQueryCacheHitCount double queryCacheMissCount stats getQueryCacheMissCount double queryCacheHitRatio queryCacheHitCount queryCacheHit
230. inary 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 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 Unique identifiers of entities and collections can be of any basic type except binary blob and clob Composite identifiers are also allowed See below for more information Die grundlegenden Wertetypen haben entsprechende Type Konstanten die auf org hibernate Hibernate definiert sind So repr sentiert Hibernate STRING zum Beispiel den string Typ 5 2 3 Angepasste Wertetypen It is relatively easy for developers to create their own value types For example you might want to persist properties of type 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 To implement a custom type implement either org hibernate UserTyp or org hibernate CompositeUserType and declare properties using the fully qualif
231. ing by specifying lazy false this second select will only be executed when you access the association Subselect fetching a second SELECT is used to retrieve the associated collections for all entities retrieved in a previous query or fetch Unless you explicitly disable lazy fetching by specifying lazy false this second select will only be executed when you access the association Batch fetching an optimization strategy for select fetching Hibernate retrieves a batch of entity instances or collections in a single SELECT by specifying a list of primary or foreign keys Hibernate unterscheidet auBerdem zwischen Immediate fetching an association collection or attribute is fetched immediately when the owner is loaded Lazy collection fetching a collection is fetched when the application invokes an operation upon that collection This is the default for collections Extra lazy collection fetching individual elements of the collection are accessed from the database as needed Hibernate tries not to fetch the whole collection into memory unless absolutely needed It is suitable for large collections Proxy fetching a single valued association is fetched when a method other than the identifier getter is invoked upon the associated object No proxy fetching a single valued association is fetched when the instance variable is accessed Compared to proxy fetching this approach is less lazy the asso
232. instances of a persistent class are considered transient by Hibernate We can make a transient instance persistent by associating it with a session DomesticCat fritz new DomesticCat 153 Kapitel 10 Das Arbeiten mit fritz setColor Color GINGER fritz setSex M fritz setName Fritz Long generatedId Long sess save fritz If cat has a generated identifier the identifier is generated and assigned to the cat when save is called If cat has an assigned identifier or a composite key the identifier should be assigned to the cat instance before calling save You can also use persist instead of save with the semantics defined in the EJB3 early draft persist makes a transient instance persistent However it does not guarantee that the identifier value will be assigned to the persistent instance immediately the assignment might happen at flush time persist also guarantees that it will not execute an INSERT statement if it is called outside of transaction boundaries This is useful in long running conversations with an extended Session persistence context save does guarantee to return an identifier If an INSERT has to be executed to get the identifier e g identity generator not sequence this INSERT happens immediately no matter if you are inside or outside of a transaction This is problematic in a long running conversation with an extended Session persistence context Alterna
233. instances returned by the query are immediately detached They are never associated with any persistence context The insert update and delete operations defined by the statelessSession interface are considered to be direct database row level operations They result in the immediate execution of a SQL INSERT UPDATE Or DELETE respectively They have different semantics to the save saveOrUpdate and delete operations defined by the session interface 14 4 Vorg nge im DML Stil As already discussed automatic and transparent object relational mapping is concerned with the management of the object state The object state is available in memory This means that manipulating data directly in the database using the SQL Data Manipulation Language DML the statements INSERT UPDATE DELETE Will not affect in memory state However Hibernate provides methods for bulk SQL style DML statement execution that is performed through the Hibernate Query Language HQL The pseudo syntax for UPDATE and DELETE Statements is UPDATE DELETE FROM EntityName WHERE where_conditions Some points to note In der from Klausel ist der FROM Schl sselbegriff optional There can only be a single entity named in the from clause It can however be aliased If the entity name is aliased then any property references must be qualified usin
234. interesting log categories are the following Tabelle 3 9 Die Protokollkategorien von Hibernate Kategorie Funktion org hibernate SoL Protokollierung aller SQL DML Anweisungen bei deren Ausf hrung org hibernate type Protokollierung aller JDBC Parameter org hibernate tool hbmde tokollierung aller SQL DDL Anweisungen bei deren Ausf hrung org hibernate pretty Protokollierung des Status aller Entities max 20 Entities die zum R umungzeitpunkt mit der Session assoziiert werden org hibernate cache Protokollierung aller Cache Vorg nge der zweiten Ebene org hibernate transact Rrotokollierung von transaktionsbezogenen Vorg nge org hibernate jdbc Protokollierung s mtlicher JDBC Ressourcen Erfassungen org hibernate hql ast Arptokollierung von HQL und SQL ASTs w hrend Abfragen Parsing org hibernate secure Protokollierung aller JAAS Authentifizierungsanfragen 45 Kapitel 3 Konfiguration Kategorie Funktion org hibernate Log everything This is a lot of information but it is useful for troubleshooting Bei der Entwicklung von Anwendungen mit Hibernate sollten Sie fast ausschlie lich mit der aktivierten debug Einstellung f r die Kategorie org hibernate so arbeiten oder alternativ mit der aktivierten Property hibernate show_sgql 3 6 Implementing a namingstrategy Das Interface org hibernate cfg NamingStrategy erm glicht es Ihnen einen Namensgebungsstandard sog naming standard f r Datenbankobjekte
235. ion bean Ending a Session usually involves four distinct phases R umen der Session Festschreibung der Transaktion Schlie en der Session Bearbeitung von Ausnahmen We discussed Flushing the session earlier so we will now have a closer look at transaction demarcation and exception handling in both managed and non managed environments 185 Kapitel 12 Transactions and 12 2 1 Die nicht gemanagte Umgebung If a Hibernate persistence layer runs in a non managed environment database connections are usually handled by simple i e non DataSource connection pools from which Hibernate obtains connections as needed The session transaction handling idiom looks like this Non managed environment idiom Session sess factory openSession Transaction tx null ery 7 tx sess beginTransaction do some work EL COn E catch RuntimeException e if tx l pull te rollback j throw e or display error message finally sess close You do not have to flush the Session explicitly the call to commit automatically triggers the synchronization depending on the FlushMMode for the session A call to close marks the end of a session The main implication of close is that the JDBC connection will be relinquished by the session This Java code is portable and runs in both non managed and JTA environments As outlined earlier a much more flexible solution is Hibernate s built
236. ion on a foreign key is common lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt many to one name address column addressId unique true not null true gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt one to one name person property ref address gt lt class gt create table Person personId bigint not null primary key addressId bigint not null unique create table Address addressId bigint not null primary key A bidirectional one to one association on a primary key uses the special id generator lt class name Person gt lt id name id column personId gt 131 Kapitel 7 Assoziations Mappings lt generator class native gt lt id gt lt one to one name address gt lt class gt lt class name Address gt lt id name id column personId gt lt generator class foreign gt lt param name property gt person lt param gt lt generator gt lt id gt lt one to one name person constrained true gt lt class gt create table Person personId bigint not null primary key create table Address personId bigint not null primary key 7 5 Bidirektionale Assoziationen mit Verbundtabellen 7 5 1 one to many many to one The following is an example of a bidirectional one to many association
237. ional specifies an interface to use for lazy initializing proxies You can specify the name of the class itself dynamic update optional defaults to false specifies that uPpDaTE SQL should be generated at runtime and can contain only those columns whose values have changed 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 select before update optional defaults to false specifies that Hibernate should never perform an SQL uppare 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 polymorphism optional defaults to implicit determines whether implicit or explicit query polymorphism is used where optional specifies an arbitrary SQL wHERE condition to be used when retrieving objects of this class persister optional specifies a custom ClassPersister batch size optional defaults to 1 specifies a batch size for fetching instances of this class by identifier optimistic lock optional defaults to version determines the optimistic locking strategy lazy optional lazy fetching can be disabled by setting lazy false entity name optional defaults to the class name Hibernate3 allows a class
238. ions as defined in the entity mapping Hibernate updates the version if the entity has a collection with changes that dirties the entity e A read only entity can be deleted Even if an entity is not read only its collection association can be affected if it contains a read only entity For details about the affect of read only entities on different property and association types see Abschnitt 11 2 Read only affect on property type For details about how to make entities read only see Abschnitt 11 1 Making persistent entities read only Hibernate does some optimizing for read only entities e It saves execution time by not dirty checking simple properties or single ended associations It saves memory by deleting database snapshots 11 1 Making persistent entities read only Only persistent entities can be made read only Transient and detached entities must be put in persistent state before they can be made read only 171 Kapitel 11 Read only entities Hibernate provides the following ways to make persistent entities read only you can map an entity class as immutable when an entity of an immutable class is made persistent Hibernate automatically makes it read only see Abschnitt 11 1 1 Entities of immutable classes for details you can change a default so that entities loaded into the session by Hibernate are automatically made read only see Abschnitt 11 1 2 Loading persistent entities as r
239. ique 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 lt property name serialNumber unique true type string column SERIAL_NUMBER gt Dann k nnte das Mapping f r OrderItem folgendes verwenden lt many to one name product property ref serialNumber column PRODUCT_SERIAL_NUMBER gt This is not encouraged however Wenn der eindeutige Schl ssel auf den verwiesen wird mehrere Properties der zugeh rigen Entity enth lt so sollten die Properties auf die verwiesen wird in einem benannten lt properties gt Element gemappt werden If the referenced unique key is the property of acomponent you can specify a property path lt many to one name owner property ref identity ssn column OWNER_SSN gt 83 Kapitel 5 Grundlagen des O R 5 1 13 One to one Eine One to One Assoziation mit einer anderen persistenten Klasse wird unter Verwendung eines one to one Elements deklariert lt one to one 8 O 886 name propertyName class ClassName cascade cascade_style constrained true false fetch join select property ref propertyNameFromAssociatedClass access field property ClassName formula any SQL expression lazy proxy no proxy false
240. irst String first this first first public String getLast return last void setLast String last 137 Kapitel 8 Komponenten Mapping this last last public char getInitial return initial void setInitial char initial this initial initial Now Name can be persisted as a component of Person Name defines getter and setter methods for its persistent properties but it does not need to declare any interfaces or identifier properties Our Hibernate mapping would look like this lt class name eg Person table person gt lt id name Key column pid type string gt lt generator class uuid gt lt id gt lt property name birthday type date gt lt component name Name class eg Name gt Sl Eelass attribute optional gt lt property name initial gt lt property name first gt lt property name last gt lt component gt lt class gt Die Personentabelle w rde die Spalten pid birthday initial first und last besitzen Like value types components do not support shared references In other words two persons could have the same name but the two person objects would contain two independent name objects that were only the same by value The null value semantics of a component are ad hoc When reloading the containing object Hibernate will assume that if all component columns are null then the entire component is null This is suitable for m
241. irst we need create our basic processing servlet Since our servlet only handles HTTP cr requests we will only implement the doGet method GI 4 package org hibernate tutorial web i Imports public class EventManagerServlet extends HttpServlet protected void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException SimpleDateFormat dateFormatter new SimpleDateFormat dd MM yyyy try Begin unit of work HibernateUtil getSessionFactory getCurrentSession beginTransaction j Process request and render page End unit of work HibernateUtil getSessionFactory getCurrentSession getTransaction commit catch Exception ex HibernateUtil getSessionFactory getCurrentSession getTransaction rollback if ServletException class isInstance ex throw ServletException ex else throw new ServletException ex 21 Kapitel 1 Tutorial Save this servlet as src main java org hibernate tutorial web EventManagerServlet java The pattern applied here is called session per request When a request hits the servlet a new Hibernate Session is opened through the first call to getCurrentSession on the SessionFactory A database transaction is then started All data access occurs inside a transaction irrespective of whether the data is read or written Do not use the auto commit mode in applications Verwe
242. ischen impliziter Polymorphie mit anderen Vererbungsmappings 150 9 2 Einschr nkungen sussnnsnsnnannennnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnennnnnnnnnnn 151 10 Das Arbeiten mit Objekten 4 444444snnnnnnnnnnnennnnnnnnnnnnnnnnnnnnnnnnnnannnnnenn 153 10 1 Statusarten von Hibernate Objekten s 444444snnnennnnnnnnnnnnnen nennen 153 10 2 Objekte persistent machen uususssssnssnnnnenennnnnnnnnnnnnennnnnnnnnnnnnnen nn 153 10 3 Das Laden eines Objekts 4444440snnannnnnnnnnnennnnnnnnnnnnnnnennnnnnnnnnnnnnnenenen 154 10 4 Anfragen las anne aan aaa an anna a anna Rennes 156 10 4 1 Ausf hren von Anfragen uusssssnssnnnnenennnnnnnnnnnnnennnnnnnnnnnnnnennnn 156 10 4 2 Das Filtern von Collections su44444snnenennnnnnnannnnnenennnnnnnannnnnenn 160 10 4 3 Kriterienanfragen 2 0 0 cece ceeeeeee cece ee aaeteeeeeeeeeeeeaaeaeeeeeeeeeeeeaaaaeeeeeseneees 161 10 4 4 Anfragen in nativer SQL 4244440snnnnnnnnnnnnnennnnnnnnnnnnnnnennnnnnnnannnnnenn 161 10 5 nderungen an persistenten Objekten vornehmen uuauannanenaenneennennnnnnnneennn 161 10 6 nderungen an abgesetzten Objekten uunaueceeaeeaeennnnnennnnnnnnnnennnnnnnnnnnnnnnnn 162 10 7 Automatische Statuserkennung 44444244snennnnnnnnsnnnnnennnnnnnnnnnnnen nn 163 10 8 Das L schen persistenter Objekte u4mssnnnnsnnnnnen
243. ited to returning the collection elements themselves Collection blackKittenMates session createFilter pk getKittens select this mate where this color eg Color BLACK intValue TaS Or Even an empty filter query is useful e g to load a subset of elements in a large collection Collection tenKittens session createFilter 160 Kriterienanfragen mother getKittens setFirstResult 0 setMaxResults 10 alise Oy 10 4 3 Kriterienanfragen HQL is extremely powerful but some developers prefer to build queries dynamically using an object oriented API rather than building query strings Hibernate provides an intuitive Criteria query API for these cases Criteria crit session createCriteria Cat class crit add Restrictions eq color eg Color BLACK crit setMaxResults 10 bist cats erit Lrt The Criteria and the associated Example API are discussed in more detail in Kapitel 16 Criteria Queries 10 4 4 Anfragen in nativer SQL You can express a query in SQL using createSQLQuery and let Hibernate manage the mapping from result sets to objects You can at any time call session connection and use the JDBC connection directly If you choose to use the Hibernate API you must enclose SQL aliases in braces List cats session createSQLQuery SELECT cat FROM CAT cat WHERE ROWNUM lt 10 FACE NEE vacate Cat classi sliste List cats session createSQLQuery WSELEGR feat
244. itel 24 Beispiel Verschi lt class name Order table orders gt lt id name id gt lt generator class native gt lt id gt lt property name date gt lt many to one name customer column customer_id gt lt list name lineItems table line_items gt lt key column order_id gt lt list index column line_number gt lt composite element class Lineltem gt lt property name quantity gt lt many to one name product column product_id gt lt composite element gt AS E lt class gt lt class name Product table products gt lt id name id gt lt generator class native gt lt id lt property name serialNumber gt lt class gt lt hibernate mapping gt customers orders line_items Und products enthalten Kunde Bestellung Bestellungsbelegzeile und Produktdaten 1ine_items fungiert auch als Assoziationstabelle die Bestellungen mit Produkten verbindet create table customers id BIGINT not null generated by default as identity name VARCHAR 255 primary key id create table orders id BIGINT not null generated by default as identity customer_id BIGINT date TIMESTAMP primary key id create table line _ items line_number INTEGER not null order_id BIGINT not null product_id BIGINT quantity INTEGER primary key order_id line_number create table products id BIGINT not null generated by default as identity serialNumber VARCHAR 255 pr
245. itten not needed by Hibernate public void addKitten Cat kitten kittens add kitten hibernate property column SEX not null true update false rs public char getSex return sex void setSex char sex this sex sex See the Hibernate website for more examples of XDoclet and Hibernate 5 5 2 Die Verwendung von JDK 5 0 Annotationen JDK 5 0 introduced XDoclet style annotations atthe language level that are type safe and checked at compile time This mechanism is more powerful than XDoclet annotations and better supported by tools and IDEs IntelliJ IDEA for example supports auto completion and syntax highlighting of JDK 5 0 annotations The new revision of the EJB specification JSR 220 uses JDK 5 0 annotations as the primary metadata mechanism for entity beans Hibernate3 implements the 102 Generated properties EntityManager of JSR 220 the persistence API Support for mapping metadata is available via the Hibernate Annotations package as a separate download Both EJB3 JSR 220 and Hibernate3 metadata is supported Nachfolgend sehen Sie ein Beispiel f r eine als EJB Entity Bean annotierte POJO Klasse Entity access AccessType FIELD public class Customer implements Serializable Id Long id String firstName String lastName Date birthday Transient Integer age Embedded private Address homeAddress OneToMany cascade CascadeType ALL JoinColumn name CU
246. l select which only returns identifiers and n additional selects to initialize the actual instances eteh ids Iterator iter sess createQuery from eg Qux q order by q likeliness iterate while iter hasNext Qux qux Qux iter next fetch the object something we couldnt express in the query if qux calculateComplicatedAlgorithm delete the current instance iter remove dont need to process the rest break 10 4 1 2 Anfragen die mit Tupeln reagieren Hibernate queries sometimes return tuples of objects Each tuple is returned as an array Iterator kittensAndMothers sess createQuery select kitten mother from Cat kitten join kitten mother mother bee iterator while kittensAndMothers hasNext Object tuple Object kittensAndMothers next Cat kitten Cat tuple 0 Cat mother Cat tuple l 10 4 1 3 Skalare Ergebnisse Queries can specify a property of a class in the select clause They can even call SQL aggregate functions Properties or aggregates are considered scalar results and not entities in persistent state Iterator results sess createQuery 157 Kapitel 10 Das Arbeiten mit select cat color min cat birthdate count cat from Cat cat varoup by cat color Plise iterator while results hasNext Object row Object results next Color type Color row 0 Date oldest Date r
247. le a Wer lushnoceurs sess close During flush an exception might occur e g if a DML operation violates a constraint Since handling exceptions involves some understanding of Hibernate s transactional behavior we discuss it in Kapitel 12 Transactions and Concurrency 166 Transitive Persistenz 10 11 Transitive Persistenz Es ist recht m hselig einzelne Objekte zu speichern zu l schen und erneut hinzuzuf gen insbesondere dann wenn man es mit einem Diagramm assoziierter Objekte zu tun hat Ein g ngiger Fall ist die Beziehung zwischen bergeordneten und untergeordneten Objekten sog parent child Beziehung Sehen Sie sich das folgende Beispiel an If the children in a parent child relationship would be value typed e g a collection of addresses or strings their life cycle would depend on the parent and no further action would be required for convenient cascading of state changes When the parent is saved the value typed child objects are saved and when the parent is deleted the children will be deleted etc This works for operations such as the removal of a child from the collection Since value typed objects cannot have shared references Hibernate will detect this and delete the child from the database Now consider the same scenario with parent and child objects being entities not value types e g categories and items or parent and child cats Entities have their own life cycle and support shared refere
248. le 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 table_name optional defaults to hibernate_sequences the name of the table to be used value_column_name optional defaults to next_va1 the name of the column on the table that is used to hold the value 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 segment_value optional defaults to default The segment key value for the segment from which we want to pull increment values for this generator segment_value_length optional defaults to 255 Used for schema generation the column size to create this segment key column 74 Identifier generator optimization initial_value optional defaults to 1 The initial value to be retrieved from the table increment_size optional defaults to 1 The value by which subsequent calls to the table should differ optimizer optional defaults to See Abschnitt 5 1 6 Identifier generator optimization 5 1 6 Identifier generator optimization 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 id
249. ll Of Query iterate For an HQL criteria call 173 Kapitel 11 Read only entities Criteria setReadOnly true Criteria setReadOnly true must be called before Criteria list Criteria uniqueResult Of Criteria scroll Entities and proxies that exist in the session before being returned by an HQL query or criteria are not affected Uninitialized persistent collections returned by the query are not affected Later when the collection is initialized entities loaded into the session will be read only if Session isDefaultReadOnly returns true Using Query setReadOnly true Of Criteria setReadOnly true works well when a single HQL query or criteria loads all the entities and intializes all the proxies and collections that the application needs to be read only When it is not possible to load and initialize all necessary entities in a single query or criteria you can temporarily change the session default to load entities as read only before the query is executed Then you can explicitly initialize proxies and collections before restoring the session default Session session factory openSession Transaction tx session beginTransaction setDefaultReadOnly true Contract contract Contract session createQuery from Contract where customerName Sherman uniqueResult Hibernate initialize contract getPlan Hibernate initialize contract getVariations Hibernate initi
250. ll cascades the save update operation to the locally changed association get a contract with an existing plan make the contract read only and change to a new plan tx session beginTransaction Contract contract Contract session get Contract class contractId session setReadOnly contract true Plan newPlan new Plan new plan contract setPlan newPlan tx commit get the same contract tx session beginTransaction contract Contract session get Contract class contractId newPlan Contract session get Plan class newPlan getId contract getPlan still refers to the original plan newPlan is non null because it was persisted when the previous transaction was committed tx commit session close 11 2 2 2 Unidirectional one to many and many to many Hibernate treats unidirectional one to many and many to many associations owned by a read only entity the same as when owned by an entity that is not read only Hibernate dirty checks unidirectional one to many and many to many associations The collection can contain entities that are read only as well as entities that are not read only Entities can be added and removed from the collection changes are flushed to the database If automatic versioning is used Hibernate will update the version due to changes in the collection if they dirty the owning entity 178 Bidirectional associations 11
251. ll not be flushed to the database Anmerkung If an entity is of an immutable class then its references to unidirectional single ended associations must be assigned when that entity is first created Because the entity is automatically made read only these references can not be updated If automatic versioning is used Hibernate will not increment the version due to local changes to unidirectional single ended associations In the following examples Contract has a unidirectional many to one association with Plan Contract cascades save and update operations to the association The following shows that changing a read only entity s many to one association reference to null has no effect on the entity s database representation get a contract with an existing plan make the contract read only and set its plan to null tx session beginTransaction Contract contract Contract session get Contract class contractId 177 Kapitel 11 Read only entities session setReadOnly contract true contract setPlan null tx commit get the same contract tx session beginTransaction contract Contract session get Contract class contractId contract getPlan still refers to the original plan tx commit session close The following shows that even though an update to a read only entity s many to one association has no affect on the entity s database representation flush sti
252. lly force Hibernate to keep the cache entries in a more readable format hibernate generate_statistics true hibernate cache use_structured_entries true 274 Das Anfragen Cache 20 4 Das Anfragen Cache Query result sets can also be cached This is only useful for queries that are run frequently with the same parameters 20 4 1 Enabling query caching Caching of query results introduces some overhead in terms of your applications normal transactional processing For example if you cache results of a query against Person Hibernate will need to keep track of when those results should be invalidated because changes have been committed against Person That coupled with the fact that most applications simply gain no benefit from caching query results leads Hibernate to disable caching of query results by default To use query caching you will first need to enable the query cache hibernate cache use_query_cache true This setting creates two new cache regions org hibernate cache StandardQueryCache holding the cached query results org hibernate cache UpdateTimestampsCache holding timestamps of the most recent updates to queryable tables These are used to validate the results as they are served from the query cache Wichtig If you configure your underlying cache implementation to use expiry or timeouts is very important that the cache timeout of the underlying cache region for the UpdateTimestampsCache be set to a h
253. log new Blog blog setName name blog setItems new ArrayList Session session _sessions openSession Transaction tx null Eey a tx session beginTransaction session persist blog tx commit 298 Hibernate Code catch HibernateException he af txl null tx vellback throw he finally session close return blog public BlogItem createBlogItem Blog blog String title String text throws HibernateException BlogItem item new BlogItem item setTitle title item setText text item setBlog blog item setDatetime Calendar getInstance blog getItems add item Session session _sessions openSession Transaction tx null try tx session beginTransaction session update blog Exo Commit iy catch HibernateException he f tz pull tx rollback k throw he finally session close return item public BlogItem createBlogItem Long blogid String title String text throws HibernateException BlogItem item new BlogItem item setTitle title item setText text item setDatetime Calendar getInstance Session session _sessions openSession Transaction tx null CEY A tx session beginTransaction Blog blog Blog session load Blog class blogid item setBlog blog blog getItems add item tx commit catch HibernateException he IE er meer rollback yy throw
254. lt composite element gt lt set gt lt class gt 8 5 Dynamische Komponenten You can also map a property oftype Map lt dynamic component name userAttributes gt lt property name foo column FOO type string gt lt property name bar column BAR type integer gt lt many to one name baz class Baz column BAZ_ID gt lt dynamic component gt The semantics of a lt dynamic component gt mapping are identical to lt component gt The advantage of this kind of mapping is the ability to determine the actual properties of the bean at deployment time just by editing the mapping document Runtime manipulation of the mapping document is also possible using a DOM parser You can also access and change Hibernate s configuration time metamodel via the configuration object 143 144 Inheritance mapping 9 1 The three strategies Hibernate unterst tzt drei grundlegende Mapping Strategien der Vererbung e Tabelle pro Klasse Hierarchie e table per subclass Tabelle pro konkrete Klasse Desweiteren unterst tzt Hibernate eine vierte etwas andere Art der Polymorphie e implizite Polymorphie It is possible to use different mapping strategies for different branches of the same inheritance hierarchy You can then make use of implicit polymorphism to achieve polymorphism across the whole hierarchy However Hibernate does not support mixing lt subclass gt lt joined subclass gt and lt
255. lushing by disabling automatic flushing or even by changing the order of queries and other operations within a particular transaction In a three tiered architecture consider using detached objects When using a servlet session bean architecture you can pass persistent objects loaded in the session bean to and from the servlet JSP layer Use a new session to service each request Use Session merge Of Session saveOrUpdate to synchronize objects with the database In a two tiered architecture consider using long persistence contexts Database Transactions have to be as short as possible for best scalability However it is often necessary to implement long running application transactions a single unit of work from the point of view of a user An application transaction might span several client request response cycles It is common to use detached objects to implement application transactions An appropriate alternative in a two tiered architecture is to maintain a single open persistence contact session for the whole life cycle of the application transaction Then simply disconnect from the JDBC connection at the end of each request and reconnect at the beginning of the subsequent request Never share a single session across more than one application transaction or you will be working with stale data Do not treat exceptions as recoverable This is more of a necessary practice than a best practice When an exception occurs roll back t
256. ly in Eclipse Development Wizards several wizards are provided with the Hibernate Eclipse tools You can use a wizard to quickly generate Hibernate configuration cfg xml files or to reverse engineer an existing database schema into POJO source files and Hibernate mapping files The reverse engineering wizard supports customizable templates Please refer to the Hibernate Tools package documentation for more information However the Hibernate main package comes bundled with an integrated tool SchemaExport aka hbm2dd1 It can even be used from inside Hibernate 21 1 Automatische Schema Generierung DDL can be generated from your mapping files by a Hibernate utility The generated schema includes referential integrity constraints primary and foreign keys for entity and collection tables Tables and sequences are also created for mapped identifier generators You must specify a SQL Dialect via the hibernate dialect property when using this tool as DDL is highly vendor specific First you must customize your mapping files to improve the generated schema The next section covers schema customization 21 1 1 Anpassung des Schemas Many Hibernate mapping elements define optional attributes named length precision and scale You can set the length precision and scale of a column with this attribute lt property name zip length 5 gt 281 Kapitel 21 Toolset Handbuch lt property name balance precision 12 scale
257. mapping gt lt database object gt lt eredte gt CREATE TRIGGER my_trigger lt create gt lt drop gt DROP TRIGGER my_trigger lt drop gt 104 Auxiliary database objects lt database object gt lt hibernate mapping gt The second mode is to supply a custom class that constructs the CREATE and DROP commands This custom class must implement the org hibernate mapping AuxiliaryDatabaseObject interface lt hibernate mapping gt lt database object gt lt definition class MyTriggerDefinition gt lt database object gt lt hibernate mapping gt Additionally these database objects can be optionally scoped so thatthey only apply when certain dialects are used lt hibernate mapping gt lt database object gt lt definition class MyTriggerDefinition gt lt dialect scope name org hibernate dialect Oracle9iDialect gt lt dialect scope name org hibernate dialect Oraclel0gDialect gt lt database object gt lt hibernate mapping gt 105 106 Collection mapping 6 1 Persistente Collections Hibernate requires that persistent collection valued fields be declared as an interface type For example public class Product private String serialNumber private Set parts new HashSet public Set getParts return parts void setParts Set parts this parts parts public String getSerialNumber return serialNumber void setSerialNumber String sn
258. me having count msg 0 Properties eines JavaBean k nnen an benannte Anfragenparameter gebunden werden Query q s createQuery from foo Foo as foo where foo name name and foo size size q setProperties fooBean fooBean has getName and getSize List foos q list i Collections sind unter Verwendung des ouery Interface mit einem Filter seitenwechselbar Query q s createFilter collection the trivial filter q setMaxResults PAGE_SIZE q setFirstResult PAGE_SIZE pageNumber List page q list Collection elements can be ordered or grouped using a query filter Collection orderedCollection s filter collection order by this amount Collection counts s filter collection select this type count this group by this type 226 Komponenten Sie k nnen die Gr e einer Collection finden ohne diese zu initialisieren Integer session createQuery select count from iterate next intValue 15 17 Komponenten Components can be used similarly to the simple value types that are used in HQL queries They can appear in the select clause as follows select p name from Person p select p name first from Person p wo die Namen Property der Person eine Komponente ist Komponenten k nnen auch in der where Klausel verwendet werden from Person p where p name name from Person p where p name first firstName Komponenten k nnen auch in der order by Klau
259. me lastName gt lt component gt lt class gt lt hibernate mapping gt Here is the table schema generated by SchemaExport create table employers id BIGINT not null name VARCHAR 255 primary key id create table employment_periods id BIGINT not null hourly_rate NUMERIC 12 2 currency VARCHAR 12 employee_id BIGINT not null employer_id BIGINT not null end_date TIMESTAMP start_date TIMESTAMP primary key id create table employees id BIGINT not null firstName VARCHAR 255 initial CHAR 1 lastName VARCHAR 255 taxfileNumber VARCHAR 255 primary key id 304 Autor Werk alter table employment_periods add constraint employment_periodsFKO foreign key employer_id references employers alter table employment_periods add constraint employment_periodsFK1 foreign key employee_id references employees create sequence employee_id_seq create sequence employment_id_seq create sequence employer_id_seq 24 2 Autor Werk Consider the following model of the relationships between work Author and Person In the example the relationship between work and Author is represented as a many to many association and the relationship between author and Person is represented as one to one association Another possibility would be to have Author extend Person id id long id long title String alias String name String getidd long d getldd long getidd
260. mes gt lt key column person_id gt lt element column person_name type string gt lt set A bag containing integers with an iteration order determined by the order by attribute lt bag name sizes table item_sizes order by size asc gt lt key column item_id gt lt element column size type integer gt lt bag gt An array of entities in this case a many to many association lt array name addresses table PersonAddress cascade persist gt lt key column personId gt lt list index column sortOrder gt lt many to many column addressId class Address gt lt array gt Eine Map von String Indexen zu Daten lt map name holidays table holidays schema dbo order by hol_name asc gt lt key column id gt lt map key column hol_name type string gt lt element column hol_date type date gt lt map gt A list of components this is discussed in the next chapter lt list name carComponents table CarComponents gt 113 Kapitel 6 Collection mapping lt key column carId gt lt list index column sortOrder gt lt composite element class CarComponent gt lt property name price gt lt property name type gt lt property name serialNumber column serialNum gt lt composite element gt ASE gt 6 2 5 One to Many Assoziationen A one to many association links the tables of two classes via a foreign key with
261. methods as well as public private and protected fields directly The choice is up to you and you can match it to fit your application design The no argument constructor is a requirement for all persistent classes Hibernate has to create objects for you using Java Reflection The constructor can be private however package or public visibility is required for runtime proxy generation and efficient data retrieval without bytecode instrumentation Save this file to the src main java org hibernate tutorial domain directory 1 1 3 Die Mapping Datei Hibernate muss dar ber informiert werden wie Objekte der persistenten Klasse geladen und gespeichert werden sollen Hier wird die Mapping Datei von Hibernate ben tigt Diese Datei informiert Hibernate dar ber auf welche Tabelle in der Datenbank zugegriffen werden soll und welche Spalten dieser Tabelle verwendet werden sollen Die Grundstruktur einer Mapping Datei sieht wie folgt aus lt xml version 1 0 gt lt DOCTYPE hibernate mapping PUBLIC Hibernate Hibernate Mapping DTD 3 0 EN http hibernate sourceforge net hibernate mapping 3 0 dtd gt lt hibernate mapping package org hibernate tutorial domain gt loool lt hibernate mapping Die Mapping Datei Hibernate DTD is sophisticated You can use it for auto completion of XML mapping elements and attributes in your editor or IDE Opening up the DTD file in your text editor is the easiest way to get an overview
262. mn BLOG_ITEM_ID gt lt generator class native gt lt id gt lt property name title column TITLE not null true gt lt property name text column TEXT not null true gt lt property name datetime column DATE_TIME not null true gt lt many to one name blog column BLOG_ID not null true gt 297 Kapitel 23 Beispiel Web Log lt class gt lt hibernate mapping gt 23 3 Hibernate Code The following class demonstrates some of the kinds of things we can do with these classes using Hibernate package eg import java util Arraylist import java util Calendar import java util Iterator import java util List import org hibernate HibernateException import org hibernate Query import org hibernate Session import org hibernate SessionFactory import org hibernate Transaction import org hibernate cfg Configuration import org hibernate tool hbm2ddl Schemakxport public class BlogMain private SessionFactory _sessions public void configure throws HibernateException _sessions new Configuration addClass Blog class addClass BlogItem class buildSessionFactory public void exportTables throws HibernateException Configuration cfg new Configuration addClass Blog class addClass BlogItem class new SchemaExport cfg create true true public Blog createBlog String name throws HibernateException Blog b
263. mn_name gt lt composite id gt A table with a composite key can be mapped with multiple properties of the class as identifier properties The lt composite id gt element accepts lt key property gt property mappings and lt key many to one gt mappings as child elements lt composite id gt lt key property name medicareNumber gt lt key property name dependent gt lt composite id 75 Kapitel 5 Grundlagen des O R The persistent class must override equals and hashCode to implement composite identifier equality It must also implement Serializable Unfortunately this approach means that a persistent object is its own identifier There is no convenient handle other than the object itself You must instantiate an instance of the persistent class itself and populate its identifier properties before you can load the persistent state associated with a composite key We call this approach an embedded composite identifier and discourage it for serious applications Eine zweite Vorgehensweise tr gt den Namen gemappter zusammengeseizter Bezeichner sog mapped composite identifier wobei die innerhalb des lt composite id gt Elements genannten Bezeichner Properties sowohl an der persistenten Klasse als auch einer separaten Bezeichnerklasse dupliziert werden lt composite id class MedicareId mapped true gt lt key property name medicareNumber gt lt key property name dependent gt
264. modus Die explizite Benutzeranfrage wird auf eine der folgenden Arten ausgedr ckt e Ein Aufruf an Session load der einen LockMode bestimmt e Ein Aufruf an Session lock Ein Aufruf an Query setLockMode 193 Kapitel 12 Transactions and Falls Session load mit UPGRADE oder UPGRADE_NOWAIT aufgerufen wird und das angefragte Objekt bis jetzt noch nicht durch die Session geladen wurde so wird das Objekt unter Verwendung von SELECT FOR UPDATE geladen Falls 1oaa f r ein bereits mit weniger restriktiver Sperre geladenes Objekt als das angefragte aufgerufen wird so ruft Hibernate lock f r das Objekt auf Session lock performs a version number check ifthe specified lock mode is READ UPGRADE Or UPGRADE_NOWAIT In the case of UPGRADE Of UPGRADE_NOWAIT SELECT FOR UPDATE is used If the requested lock mode is not supported by the database Hibernate uses an appropriate alternate mode instead of throwing an exception This ensures that applications are portable 12 5 Connection release modes One of the legacies of Hibernate 2 x JDBC connection management meant that a Session would obtain a connection when it was first required and then maintain that connection until the session was closed Hibernate 3 x introduced the notion of connection release modes that would instruct a session how to handle its JDBC connections The following discussion is pertinent only
265. n it is possible to force Hibernate to fetch the lazy properties in the first query immediately using fetch all properties from Document fetch all properties order by name from Document doc fetch all properties where lower doc name like cats 15 4 Formen der Verbundsyntax HQL unterst tzt zwei Arten von Association Joining implicit und explicit 211 Kapitel 15 HQL Die Hiberna The queries shown in the previous section all use the explicit form that is where the join keyword is explicitly used in the from clause This is the recommended form Die implicit Form verwendet den Join Schl sselbegriff nicht Statt dessen sind die Assoziationen unter Verwendung von Punktnotation dereferenziert implicit Joins k nnen in jedem der HQL S tze erscheinen implicit Join Ergebnisse resultieren in inner Joins in der sich ergebenden SQL Anweisung 12991 S from Cat as cat where cat mate name like 15 5 Referring to identifier property There are 2 ways to refer to an entity s identifier property The special property lowercase id may be used to reference the identifier property of an entity provided that the entity does not define a non identifier property named id If the entity defines a named identifier property you can use that property name References to composite identifier properties follow the same naming rules If the entity has a non identifier property named id the composite identifier
266. n API for direct execution of UPDATE Or DELETE statements Hibernate is a state management service you do not have to think in statements to use it JDBC is a perfect API for executing SQL statements you can get a JDBC connection at any time by calling session connection Furthermore the notion of mass operations conflicts with object relational mapping for online transaction processing oriented applications Future versions of Hibernate can however provide special mass operation functions See Kapitel 14 Batch Verarbeitung for some possible batch operation tricks 10 6 nderungen an abgesetzten Objekten Zahlreiche Anwendungen m ssen ein Objekt in einer Transaktion abrufen dieses f r Modifizierungen an die Ul Schicht schicken und die nderungen anschlie end in einer neuen Transaktion speichern Anwendungen die diese Herangehensweise in einer Umgebung mit hoher Nebenl ufigkeit d h h ufigem gleichzeitigen Zugriff benutzen verwenden in der Regel versionierte Daten um die Isolation der langen Arbeitseinheit zu gew hrleisten Hibernate unterst tzt dieses Modell indem es mittels der Session update oder Session merge Methoden die M glichkeit der Wiederanbindung abgesetzter Instanzen bietet in the first session Cat cat Cat firstSession load Cat class catId Cat potentialMate new Cat firstSession save potentialMate in a higher layer of the application cat setMate potentialMate later
267. n L schungen alle L schungen Aktualisierungen und Einf gungen von Elementen der Collection alle Einf gungen in Collections oOo oa fF W PP all entity deletions in the same order the corresponding objects were deleted using Session delete An exception is that objects using nat ive ID generation are inserted when they are saved Except when you explicitly flush there are absolutely no guarantees about when the session executes the JDBC calls only the order in which they are executed However Hibernate does guarantee that the Query 1list will never return stale or incorrect data It is possible to change the default behavior so that flush occurs less frequently The FlushMode class defines three different modes only flush at commit time when the Hibernate Transaction API is used flush automatically using the explained routine or never flush unless f1ush is called explicitly The last mode is useful for long running units of work where a Session is kept open and disconnected for a long time see Abschnitt 12 3 2 Erweiterte Session und automatische Versionierung sess sf openSession Transaction tx sess beginTransaction sess setFlushMode FlushMode COMMIT allow queries to return stale state Cat izi Cat sess load Cat class id izi setName iznizi might return stale data sess find from Cat as cat left outer join cat kittens kitten change to izi is not flushed Ex commie
268. n SQL query with a table inner join For example from Foo foo 215 Kapitel 15 HQL Die Hiberna where foo bar baz customer address city is not null would result in a query that would require four table joins in SQL The operator can be used to compare not only properties but also instances from Cat cat Cat rival where cat mate rival mate select cat mate from Cat cat Cat mate where cat mate mate The special property lowercase ia can be used to reference the unique identifier of an object See Abschnitt 15 5 Referring to identifier property for more information from Cat as cat where cat id 123 from Cat as cat where cat mate id 69 The second query is efficient and does not require a table join Properties of composite identifiers can also be used Consider the following example where Person has composite identifiers consisting of country and medicareNumber from bank Person person where person id country AU and person id medicareNumber 123456 from bank Account account where account owner id country AU and account owner id medicareNumber 123456 Once again the second query does not require a table join See Abschnitt 15 5 Referring to identifier property for more information regarding referencing identifier properties The special property class accesses the discriminator value of an instance in the case of polymorphic persistence A Java class name embedded
269. n enableFetchProfile customer with orders name matches from mapping Customer customer Customer session get Customer class customerld Currently only join style fetch profiles are supported but they plan is to support additional styles See HHH 3414 http opensource atlassian com projects hibernate orowse HHH 34 1 4 for details 20 1 8 Die Verwendung von Lazy Property Fetching Hibernate3 supports the lazy fetching of individual properties This optimization technique is also known as fetch groups Please note that this is mostly a marketing feature optimizing row reads is much more important than optimization of column reads However only loading some properties of aclass could be useful in extreme cases For example when legacy tables have hundreds of columns and the data model cannot be improved Um das lazy Laden von Properties zu aktivieren setzen Sie das 1azy Attribut auf Ihr bestimmtes Property Mapping lt class name Document gt lt id name id gt lt generator class native gt lt id gt lt property name name not null true length 50 gt lt property name summary not null true length 200 lazy true gt lt property name text not null true length 2000 lazy true gt lt class gt 269 Kapitel 20 Verbesserung der Lazy property loading requires buildtime bytecode instrumentation If your persistent classes are not enhanced Hibernate will ignore lazy prop
270. n key column For most collections this is implied For unidirectional one to many associations the foreign key column is nullable by default so you may need to specify not null true lt key column productSerialNumber not null true gt w p The foreign key constraint can use ON DELE 4 H E CASCADE lt key column productSerialNumber on delete cascade gt Die vollst ndige Definition des lt key gt Elements finden Sie im vorangegangenen Kapitel 6 2 2 Collection Elemente Collections can contain almost any other Hibernate type including basic types custom types components and references to other entities This is an important distinction An object in a collection might be handled with value semantics its life cycle fully depends on the collection owner or it might be a reference to another entity with its own life cycle In the latter case only the link between the two objects is considered to be a state held by the collection Der enthaltene Typ wird als Typ von Collection Element bezeichnet Collection Elemente werden durch lt element gt oder lt composite element gt oder im Fall von Entity Verweisen durch lt one to many gt oder lt many to many gt gemappt Die ersten beiden Elemente mappen mit Wertsemantik die beiden folgenden werden f r das Mappen von Entity Assoziationen verwendet 6 2 3 Indizierte Collections All collection mappings except those with set and bag semantic
271. n l schen und anschlie end drei Reihen einf gen e remove the whole collection in one SQL DELETE and insert all five current elements one by one Hibernate cannot know that the second option is probably quicker It would probably be undesirable for Hibernate to be that intuitive as such behavior might confuse database triggers etc Fortunately you can force this behavior i e the second strategy at any time by discarding i e dereferencing the original collection and returning a newly instantiated collection with all the current elements One shot delete does not apply to collections mapped inverse true 20 6 Leistungsuberwachung Optimierungen machen ohne Uberwachung und Zugriff auf Performanzzahlen wenig Sinn Hibernate liefert eine ganze Bandbreite von Zahlen zu seinen internen Vorgangen Statistiken sind in Hibernate Uber die SessionFactory verf gbar 278 Die berwachung einer SessionFactory 20 6 1 Die berwachung einer SessionFactory Sie k nnen auf zwei Arten auf SessionFactory Metriken zugreifen Die erste M glichkeit ist es sessionFactory getStatistics aufzurufen und die Statistics selbst zu lesen und anzuzeigen Hibernate can also use JMX to publish metrics if you enable the statisticsService MBean You can enable a single MBean for all your SessionFactory or one per factory See the following code for minimalistic configuration examples MBean service registration for a specific
272. naged transactions BMT Hibernate will tell the application server to start and end a BMT transaction if you use the Transaction API The transaction management code is identical to the non managed environment BMT idiom Session sess factory openSession Transaction tx null try tx sess beginTransaction do some work tx commit catch RuntimeException e af es l null ts rollbace I throw e or display error message finally SESS Glose If you want to use a transaction bound Session that is the getCurrentSession functionality for easy context propagation use the JTA UserTransaction API directly BMT idiom with getCurrentSession try UserTransaction tx UserTransaction new InitialContext lookup java comp UserTransaction tx begin Do some work on Session bound to transaction factory getCurrentSession load factory getCurrentSession persist 187 Kapitel 12 Transactions and ex ecommiei F catch RuntimeException e tx rollback throw e or display error message With CMT transaction demarcation is completed in session bean deployment descriptors not programmatically The code is reduced to CMT idiom Session sess factory getCurrentSession do some work In a CMT EJB even rollback happens automatically An unhandled RuntimeException thrown by a session bean method tells the container to set th
273. name firstname gt lt property name lastname gt lt set name events table PERSON_EVENT gt lt key column PERSON_ID gt lt many to many column EVENT_ID class Event gt lt set gt lt class gt 15 Kapitel 1 Tutorial Hibernate supports a broad range of collection mappings a set being most common For a many to many association or n m entity relationship an association table is required Each row in this table represents a link between a person and an event The table name is decalred using the table attribute of the set element The identifier column name in the association for the person side is defined with the key element the column name for the event s side with the column attribute of the many to many You also have to tell Hibernate the class of the objects in your collection the class on the other side of the collection of references Das Datenbankschema f r dieses Mapping lautet daher EVENTS PERSON_EVENT PERSON EVENT_ID ge gt EVENT_ID EVENT_DATE PERSON_ID zn PERSON_ID TITLE AGE FIRSTNAME LASTNAME 1 2 3 Das Bearbeiten der Assoziation Now we will bring some people and events together in a new method in EventManager private void addPersonToEvent Long personId Long eventId Session session HibernateUtil getSessionFactory getCurrentSession session beginTransaction Person aPerson Person session load Person class perso
274. name varchar 255 parent_id references parent parent_id bigint Falls der parent erforderlich ist verwenden Sie eine bidirektionale One to Many Assoziation lt hibernate mapping gt lt class name Parent gt lt id name id gt lt generator class sequence gt lt id gt lt set name children inverse true gt lt key column parent_id gt lt one to many class Child gt lt set gt lt class gt lt class name Child gt lt id name id gt lt generator class sequence gt lt id gt lt property name name gt lt many to one name parent class Parent column parent_id not null true gt lt class gt lt hibernate mapping 2 Beachten Sie die nor NuLL Bedingung create table parent id bigint not null primary key create table child id bigint not null alter table child add constraint childfk0 primary key name varchar 255 parent_id bigint not null parent_id references parent 121 Kapitel 6 Collection mapping Alternatively if this association must be unidirectional you can declare the not NULL constraint on the lt key gt mapping lt hibernate mapping gt lt class name Parent gt lt id name id gt lt generator class sequence gt lt id gt lt set name children gt lt key column parent_id not null true gt lt one to many class Child gt lt set gt lt class gt lt class name Child gt lt id
275. nceof Auditable loads t J return false public boolean onSave Object entity Serializable id Object state String propertyNames Type types if entity instanceof Auditable createstt for int i 0 i lt propertyNames length i if createTimestamp equals propertyNames i state i new Date return true return false public void afterTransactionCompletion Transaction tx if tx wasCommitted System out println Creations creates Updates updates Loads loads updates 0 creates 0 loads 0 There are two kinds of inteceptors Session scoped and SessionFactory scoped Ein f r die session zust ndiger Interzeptor wird beim ffnen einer Session unter Verwendung einer der Uberlasteten SessionFactory openSession Methoden spezifiziert die einen Interceptor akzeptieren Session session sf openSession new AuditInterceptor 198 Ereignissystem A SessionFactory Scoped interceptor is registered with the Configuration object prior to building the sessionFactory Unless a session is opened explicitly specifying the interceptor to use the supplied interceptor will be applied to all sessions opened from that SessionFactory SessionFactory scoped interceptors must be thread safe Ensure that you do not store session specific states since multiple sessions will use this interceptor potentially concurrently new Configuration setInte
276. nces Removing an entity from the collection does not mean it can be deleted and there is by default no cascading of state from one entity to any other associated entities Hibernate does not implement persistence by reachability by default F r jeden Grundvorgang der Hibernate Session einschlie lich persist merge saveOrUpdate delete lock refresh evict replicate gibt es eine entsprechende Art der Weitergabe Die Arten sind dem entsprechend create merge sav update delete lock refresh evict replicate benannt Falls Sie m chten dass ein Vorgang entlang einer Assoziation weitergegeben wird so m ssen Sie dass im Mapping Dokument angeben Zum Beispiel wie folgt aussehen lt one to one name person cascade persist gt Die Arten der Weitergabe sog Cascade Styles k nnen kombiniert werden lt one to one name person cascade persist delete 1lock gt You can even use cascade all to specify that all operations should be cascaded along the association The default cascade none specifies that no operations are to be cascaded Eine besondere Art der Weitergabe namens delete orphan gilt nur bei One to Many Assoziationen und zeigt an dass der delete Vorgang angewendet werden soll wenn ein untergeordnetes Objekt aus der Assoziation entfernt wird Empfehlungen It does not usually make sense to enable cascade on a lt many to one gt Of lt many to many gt association Cascade is o
277. nden Sie keine neue Hibernate Session f r jeden Datenbankvorgang Verwenden Sie eine Hibernate session die die gesamte Anfrage umfasst Verwenden Sie getCurrentSession damit diese automatisch an den aktuellen Java Thread gebunden wird Next the possible actions of the request are processed and the response HTML is rendered We will get to that part soon Finally the unit of work ends when processing and rendering are complete If any problems occurred during processing or rendering an exception will be thrown and the database transaction rolled back This completes the session per request pattern Instead of the transaction demarcation code in every servlet you could also write a servlet filter See the Hibernate website and Wiki for more information about this pattern called Open Session in View You will need it as soon as you consider rendering your view in JSP not in a servlet 1 3 2 Bearbeitung und Rendering Now you can implement the processing of the request and the rendering of the page Write HTML header PrintWriter out response getWriter oure prime ime nemi gt lt head gt lt title gt Event Manager lt title gt lt head gt lt body gt Handle actions if store equals request getParameter action String eventTitle request getParameter eventTitle String eventDate request getParameter eventDate if equals eventTitle equals eventDate out p
278. ne of its regions disregard any cached results it finds there you can use org hibernate Query setCacheMode CacheMode REFRESH In conjunction with the region you have defined for the given query Hibernate will selectively force the results cached in that particular region to be refreshed This is particularly useful in cases where underlying data may have been updated via a separate process and is a far more efficient alternative to bulk eviction of the region via org hibernate SessionFactory evictQueries 20 5 Die Perfomance der Collection verstehen In the previous sections we have covered collections and their applications In this section we explore some more issues in relation to collections at runtime 20 5 1 Taxonomie Hibernate unterscheidet drei Grundtypen von Collections Collections von Werten one to many associations many to many associations Diese Klassifizierung unterscheidet die verschiedenen Tabellen und Fremdschl sselbeziehungen aber sagt so gut wie nichts ber das relationale Modell aus Um die relationale Struktur und Performance Eigenschaften vollst ndig zu verstehen m ssen wir die Struktur des von Hibernate zur Aktualisierung und L schung von Reihen der Collection verwendeten Prim rschl ssels ber cksichtigen Das legt die folgende Klassifizierung nahe e indizierte Collections 276 Listen Maps idbags und Sets sind die am effizientesten zu aktualisierenden Collections
279. ned from a java sql Connection to that database This was much better expect that this resolution was limited to databases Hibernate know about ahead of time and was in no way configurable or overrideable Starting with version 3 3 Hibernate has a fare more powerful way to automatically determine which dialect to should be used by relying on a series of delegates which implement the org hibernate dialect resolver DialectResolver which defines only a single method public Dialect resolveDialect DatabaseMetaData metaData throws JDBCConnectionException The basic contract here is that if the resolver understands the given database metadata then it returns the corresponding Dialect if not it returns null and the process continues to the next resolver The signature also identifies org hibernate exception JDBCConnectionException as possibly being thrown A JDBCConnectionException here is interpreted to imply a non transient aka non recoverable connection problem and is used to indicate an immediate stop to resolution attempts All other exceptions result in a warning and continuing on to the next resolver 319 Kapitel 26 Database Portabil The cool part about these resolvers is that users can also register their own custom resolvers which will be processed ahead of the built in Hibernate ones This might be useful in a number of different situations it allows easy integration for auto detection of dialects beyond those
280. ners can either be registered programmatically through the configuration object or specified in the Hibernate configuration XML Declarative configuration through the properties file is not supported Here is an example of a custom load event listener public class MyLoadListener implements LoadEventListener this is the single method defined by the LoadEventListener interface public void onLoad LoadEvent event LoadEventListener LoadType loadType throws HibernateException if MySecurity isAuthorized event getEntityClassName event getEntityId throw MySecurityException Unauthorized access Sie ben tigen au erdem einen Konfigurationseintrag der Hibernate mitteilt dass der Listener zus tzlich zum Standard Listener verwendet werden soll 199 Kapitel 13 Interzeptoren und lt hibernate configuration gt lt sesslon factory lt event type load gt lt listener class com eg MyLoadListener gt lt listener class org hibernate event def DefaultLoadEventListener gt lt event gt lt session factory gt lt hibernate configuration gt Instead you can register it programmatically Configuration cfg new Configuration LoadEventListener stack new MyLoadListener new DefaultLoadEventListener cfg EventListeners setLoadEventListeners stack Listeners registered declaratively cannot share instances If the same class name is used in multiple lt listener gt elements
281. ng osassa a a aai 278 20 6 Leistungs berwachung cceeeeeeeeeeeeee ee eeeeeeaaeeeeeeaaeeeeeeaaeeeeeaaeeeeeaaeeeeeeaaaaees 278 20 6 1 Die berwachung einer SessionFactory cccccccccesscscesscssesessseesesseees 279 20 6 2 Metriken u nn aan ne a a dens an nee nahe 279 21 Toolset Handbuch 0 era AER 281 21 1 Automatische Schema Generierung ccceceeeeeeeee ee eeeeeeeeeeeeeeaeaaeaeeeeeeeeeeeeaaa 281 21 1 1 Anpassung des Schemas 44244s4ssnennnnnnnnnnnnnnnnennnnnnnnnnnnen nn 281 21 1 2 Start des To0ols u 2 e EE E REA 285 211 3 PFOPEHIES nun a ee 285 21 1 4 Die Verwendung von Ant uuessssenennnsnnnennnnnnnennnnnnnnnnnnnnn nn ENINA 286 21 1 5 Inkrementelle Schema Aktualisierungen 4msmssnnsnsnnnen nennen 286 21 1 6 Die Verwendung von Ant bei inkrementellen Schema Aktualisierungen 287 21 1 7 Schema Validierung 444444444000nnannnnnnnnnnenennnnnnnnnnnnnennnnnnnnnnnnn 287 21 1 8 Die Verwendung von Ant zur Schema Validierung 288 22 Beispiel Parent Child 4444444444Hennnnnnnnnnnnnenennnnnnnnnnnnnennnnnnnnannnn 289 22 1 Eine Anmerkung zu Collections 4usnnnnsnsnnnnnenennnnnnnannnnnennnnnnnnnnnnn 289 22 2 Bidirektionales One to Many uuuusssssssssennenennnnnnnsnnnnnennnnnnnnnnnnnnnnnnnnnnnnnnn 289 22 3 Cascading life cycle neriie E E E E 291 22 4 Cascades and unsa
282. nld Event anEvent Event session load Event class eventId aPerson getEvents add anEvent session getTransaction commit After loading a Person and an Event simply modify the collection using the normal collection methods There is no explicit call to update Or save Hibernate automatically detects that the collection has been modified and needs to be updated This is called automatic dirty checking You can also try it by modifying the name or the date property of any of your objects As long as they are in persistent state that is bound to a particular Hibernate org hibernate Session Hibernate monitors any changes and executes SQL in a write behind fashion The process of synchronizing the memory state with the database usually only at the end of a unit of work is called flushing In our code the unit of work ends with a commit or rollback of the database transaction 16 Das Bearbeiten der Assoziation You can load person and event in different units of work Or you can modify an object outside of aorg hibernate Session When it is not in persistent state if it was persistent before this state is called detached You can even modify a collection when it is detached private void addPersonToEvent Long personId Long eventId Session session HibernateUtil getSessionFactory getCurrentSession session beginTransaction Person aPerson Person session createQuery select p from
283. nnnnnnnnnnnen mann 194 13 Interzeptoren und Ereignisse 4 unnnnsnennnnnnnnnnnnnnnnnnnnn nn nnnn en nnnnennn en 197 183 1 Interzeptoren ee ren reer errnreter rrrrrce 197 13 2 Ereignissystem 2 2 un na EEA 199 13 3 Deklarative Sicherheit in Hibernate 4224444040ennnnnnnannnnnennnnnnnnnnnnnn 200 14 Batch Ver rbeit ng 4 40er ee 203 14 1 Batch Einf gungen Batch Inserts 24444444000nnnnnnnnnnnn nenn nnnnnnannnnnenn 203 14 2 Batch Aktualisierungen su4044444snneneennnnnnnnnnnnnnennnnnnnnnnnnnnnen nn nnnnnnannnnnenn 204 14 3 Das Interface der StatelessSession u 44s2444senennnnnnnnannnnn een nnnnnnannnnnenn 204 14 4 Vorg nge im DML Stil u nee 205 15 HQL Die Hibernate Query Language u4sunnnnsnnnnneneennnnnnnnnnnnnnn nn 209 15 1 Beachtung der Gro und Kleinschreibung sesssssesseseresrsssessssrrrrrrsrsessrrrrrnns 209 15 2 Die from Klausel epeei inaani aiaa naeia 209 15 3 Assoziationen und Verb nde Joins uunnssenennnnnnnnnnnnnnnnnnnnnnnnnnnn nenn 210 15 4 Formen der Verbundsyntax 444444H44Rnen nn ee eeeeee NE A EARNER 211 15 5 Referring to identifier property uusssnsnssnennennnnnnnnnnnnnnnenennnnnnnnnnnnen nn 212 15 6 Die select Klausel an n ea ea 212 15 7 Aggregierte Funktionen u4r4s4unnnnennnnnnnnnnnnnnnennn nennen n
284. no intervening collection table This mapping loses certain semantics of normal Java collections An instance of the contained entity class cannot belong to more than one instance of the collection An instance of the contained entity class cannot appear at more than one value of the collection index An association from Product to Part requires the existence of a foreign key column and possibly an index column to the Part table A lt one to many gt tag indicates that this is a one to many association lt one to many class ClassName not found ignore exception entity name EntityName node element name embed xml true false i class required the name of the associated class not ound optional defaults to except ion specifies how cached identifiers that reference missing rows will be handled ignore will treat a missing row as a null association entity name optional the entity name of the associated class as an alternative to class The lt one to many gt element does not need to declare any columns Nor is it necessary to specify the table name anywhere Warnung If the foreign key column of a lt one to many gt association is declared NOT NULL you must declare the lt key gt mapping not null true or use a bidirectional 114 Fortgeschrittene Collection Mappings association with the collection mapping marked inverse true See the discussion of bidirectional associ
285. nsbesondere dann von Nutzen wenn Datenbank Trigger zur Initialisierung der Objekt Properties verwendet werden sess save cat 155 Kapitel 10 Das Arbeiten mit sess flush force the SQL INSERT sess refresh cat re read the state after the trigger executes How much does Hibernate load from the database and how many SQL sELEcTs will it use This depends on the fetching strategy This is explained in Abschnitt 20 1 Abrufstrategien 10 4 Anfragen If you do not know the identifiers of the objects you are looking for you need a query Hibernate supports an easy to use but powerful object oriented query language HQL For programmatic query creation Hibernate supports a sophisticated Criteria and Example query feature QBC and QBE You can also express your query in the native SQL of your database with optional support from Hibernate for result set conversion into objects 10 4 1 Ausfuhren von Anfragen HQL und native SQL Anfragen werden durch eine Instanz von org hibernate Query reprasentiert Dieses Interface bietet Methoden zur Parameter Bindung Handhabung von Ergebniss tzen sog result sets und f r das Ausf hren der tats chlichen Anfrage Sie k nnen mittels der Session immer eine Query erhalten List cats session createQuery from Cat as cat where cat birthdate lt setDate 0 date oikaise 5 List mothers session createQuery select mother from Cat as cat jo
286. nstructor as an actual typesafe Java object select new Family mother mate offspr from DomesticCat as mother join mother mate as mate left join mother kittens as offspr You can assign aliases to selected expressions using as select max bodyWeight as max min bodyWeight as min count as n from Cart eat Das ist besonders in Verbindung mit select new map n tzlich select new map max bodyWeight as max min bodyWeight as min count as n from Cat cat Diese Anfrage reagiert mit einer Map von Aliassen zu gew hlten Werten 213 Kapitel 15 HQL Die Hiberna 15 7 Aggregierte Funktionen HQL queries can even return the results of aggregate functions on properties select avg cat weight sum cat weight max cat weight count cat from Cok cat The supported aggregate functions are avg 4 SUM leee 9 IN MaR count count count distinct count all You can use arithmetic operators concatenation and recognized SQL functions in the select clause select cat weight sum kitten weight from Cat cat join cat kittens kitten group by cat id cat weight select firstName linitial lupper lastName from Person The distinct and al keywords can be used and have the same semantics as in SQL select distinct cat name from Cat cat select count distinct cat name count cat from Cat cat 15 8 Polymorphe Anfragen Eine Anfrage wie from Cat as eat
287. ntity 240 Wiedergabe nicht gemanagter Entities Beschreibung Syntax Beispiel Alle Properties aliasname item einer Entity Ein Collection aliasname key ORGID as coll key Schl ssel Die id einer aliasname id EMPID as coll id Collection Das Element einer aliasname elemeniD as coll element Collection property of the aliasname elemei ME as coll element name element in the propertyname collection Alle Properties des aliasname elemeido l element Elements in der Collection All properties of the aliasname coll collection 17 1 5 Wiedergabe nicht gemanagter Entities It is possible to apply a ResultTransformer to native SQL queries allowing it to return non managed entities sess createSQLQuery SELECT NAME BIRTHDATE FROM CATS setResultTransformer Transformers aliasToBean CatDTO class Diese Anfrage spezifiziert den SQL Anfragen String ein Ergebnistransformer Die Anfrage oben wird eine Liste von CatDTo wiedergeben die instantiiert wurde und die Werte f r NAME und BIRTHNAME in die entsprechenden Properties oder Felder eingespeist hat 17 1 6 Umgang mit Vererbung Native SQL queries which query for entities that are mapped as part of an inheritance must include all properties for the baseclass and all its subclasses 17 1 7 Parameter Native SQL queries support positional as well as named parameters
288. ntity table by not declaring an alias on a particular column This would be customerld in the given example You can also use the nested lt formula gt mapping element if you do not want to use the attribute 5 1 12 Many to one An ordinary association to another persistent class is declared using a many to one element The relational model is a many to one association a foreign key in one table is referencing the primary key column s of the target table lt many to one name propertyName column column_name class ClassName cascade cascade_style fetch join select update true false insert true false 20200909999 property ref propertyNameFromAssociatedClass 81 Kapitel 5 Grundlagen des O R O O 8 8S D access field property ClassName unique true false not null true false optimistic lock true false lazy proxy no proxy false not found ignore exception entity name EntityName 8828289898 formula arbitrary SOL expression node element name Qattribute name element attribute embed xml true false index index_name unique_key unique_key_id foreign key foreign_key_name name the name of the property column optional the name of the foreign key column This can also be specified by nested lt column gt element s class optional defaults to the property type determined by reflection the name of the associated class cascade optional spec
289. o visit http caveatemptor hibernate org and download the example application from UPwH 5 Antworten auf haufig gestellte Fragen FAQs finden Sie auf der Website von Hibernate 6 Auf der Hibernate Website befinden sich auch Demos Beispiele und Anleitungen Dritter 7 Bei Fragen wenden Sie sich an das Benutzerforum das mit der Hibernate Website verlinkt ist Wir bieten auch ein JIRA Problemverfolgungssystem f r Fehlerberichte und Feature Anfragen Falls Sie an der Entwicklung von Hibernate interessiert sind registrieren Sie sich bei der Mailing Liste f r Entwickler Falls Sie diese Dokumentation in Ihre Sprache bersetzen m chten setzen Sie sich mittels der Mailing Liste f r Entwickler mit uns in Verbindung If you have questions use the user forum linked on the Hibernate website We also provide a JIRA issue tracking system for bug reports and feature requests If you are interested in the xi Vorwort development of Hibernate join the developer mailing list If you are interested in translating this documentation into your language contact us on the developer mailing list Commercial development support production support and training for Hibernate is available through JBoss Inc see http www hibernate org SupportTraining Hibernate is a Professional Open Source project and a critical component of the JBoss Enterprise Middleware System JEMS suite of products xii Tutorial Intended for new users t
290. objects depicted in the diagrams 28 bersicht SessionFactory org hibernate SessionFactory A threadsafe immutable cache of compiled mappings for a single database A factory for Session and a client Of ConnectionProvider SessionFactory can hold an optional second level cache of data that is reusable between transactions at a process or cluster level Session org hibernate Session A single threaded short lived object representing a conversation between the application and the persistent store It wraps a JDBC connection and is a factory for Transaction Session holds a mandatory first level cache of persistent objects that are used when navigating the object graph or looking up objects by identifier Persistente Objekte und Collections Short lived single threaded objects containing persistent state and business function These can be ordinary JavaBeans POJOs They are associated with exactly one Session Once the Session is closed they will be detached and free to use in any application layer for example directly as data transfer objects to and from presentation Tempor re und abgesetzte Objekte und Collections Instances of persistent classes that are not currently associated with a Session They may have been instantiated by the application and not yet persisted or they may have been instantiated by a closed Session Transaktion org hibernate Transaction Optional A single threaded short lived object used by th
291. odel entityMetamodel PersistentClass mappedEntity super entityMetamodel mappedEntity public EntityNameResolver getEntityNameResolvers return new EntityNameResolver MyEntityNameResolver INSTANCE public String determineConcreteSubclassEntityName Object entityInstance SessionFactoryImplementor factory String entityName ProxyHelper extractEntityName entityInstance if entityName null entityName super determineConcreteSubclassEntityName entityInstance factory return entityName In order to register an org hibernate EntityNameResolver users must either 1 Implement a custom Tuplizer implementing the getEnt ityNameResolvers method 2 Register it with the org hibernate impl SessionFactoryImpl which is the implementation class for org hibernate SessionFactory using the registerEntityNameResolver method 62 Grundlagen des O R Mappings 5 1 Mapping Deklaration Object relational mappings are usually defined in an XML document The mapping document is 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 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 Here is an example mapping lt xml version 1 0 g
292. of the most useful allows you to specify SQL directly List cats sess createCriteria Cat class add Restrictions sqlRestriction lower alias name like lower Fritz Hibernate STRING alaise A Der alias Platzhalter wird durch den Reihen Alias der angefragten Entity ersetzt You can also obtain a criterion from a Property instance You can create a Property by calling Property forName Property age Property forName age List cats sess createCriteria Cat class add Restrictions disjunction add age isNull add age eq new Integer 0 add age eq new Integer 1 add age eq new Integer 2 ine cadal Property forName nane int new String i Fritz TIZ Nena Sth 16 3 Die Ergebnisse ordnen You can order the results using org hibernate criterion Order List cats sess createCriteria Cat class add Restrictions like name F addOrder Order asc name addOrder Order desc age setMaxResults 50 slige List cats sess createCriteria Cat class add Property forName name like F addOrder Property forName name asc addOrder Property forName age desc setMaxResults 50 TESEO 230 Assoziationen 16 4 Assoziationen By navigating associations using createCriteria you can specify constraints upon related entities List cats sess createCriteria Cat class add Restrictions like
293. olumn 78 Property 8 O 8 8 name propertyName access field property ClassName unsaved value null undefined source vm db ooco 90 generated never always node element name attribute name element attribute column optional defaults to the property name the name of a column holding the timestamp name the name of a JavaBeans style property of Java type Date or Timestamp of the persistent class access optional defaults to property the strategy Hibernate uses for accessing the property value unsaved value optional defaults to nu11 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 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 generated optional defaults to never specifies that this timestamp property value is actually generated by the database See
294. omer gt 309 Kapitel 24 Beispiel Verschi lt id name customerId length 10 gt lt generator class assigned gt lt id gt lt property name name not null true length 100 gt lt property name address not null true length 200 gt lt list name orders inverse true cascade save update gt lt key column customerId gt lt index column orderNumber gt lt one to many class Order gt SASE gt lt class gt lt class name Order table CustomerOrder lazy true gt lt synchronize table LineItem gt lt synchronize table Product gt lt composite id name id class Order Id gt lt key property name customerId length 10 gt lt key property name orderNumber gt lt composite id gt lt property name orderDate type calendar_date not null true gt lt property name total gt lt formula gt select sum li quantity p price from Lineltem li Product p where li productId p productId and li customerId customerId and li orderNumber orderNumber lt formula gt lt property gt lt many to one name customer column customerId insert false update false not null true gt lt bag name lineltems fetch join inverse true cascade save update gt lt key gt lt column name customerId gt lt column name orderNumber gt lt key gt lt one to many class LineItem gt lt bag gt 310 Beispiel f
295. omponent as an identifier of an entity class Your component class must satisfy certain requirements e Es muss java io Serializable implementieren e It must re implement equals and hashCode consistently with the database s notion of composite key equality 140 Komponenten als zusammengesetzte Bezeichner You cannot use an IdentifierGenerator to generate composite keys Instead the application must assign its own identifiers Use the lt composite id gt tag with nested lt key property gt elements in place of the usual lt ia gt declaration For example the OrderLine class has a primary key that depends upon the composite primary key of Order lt class name OrderLine gt lt composite id name id class OrderLineld gt lt key property name lineld gt lt key property name orderId gt lt key property name customerId gt lt composite id gt lt property name name gt lt many to one name order class Order insert false update false gt lt column name orderId gt lt column name customerId gt lt many to one gt MISS gt Any foreign keys referencing the OrderLine table are now composite Declare this in your mappings for other classes An association to orderLine is mapped like this lt many to one name orderLine class OrderLine gt S izchenivelass Fateributen s optional as usuali lt column name lineId gt lt column name orderId gt
296. onal proxy attribute enables lazy initialization of persistent instances of the class Hibernate will initially return CGLIB proxies that implement the named interface The persistent object will load when a method of the proxy is invoked See Initializing collections and proxies below Implicit polymorphism 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 polymorphism 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 inside this lt class gt declaration as a lt subclass gt Of lt joined subclass gt For most purposes the default polymorphism implicit is appropriate Explicit polymorphism 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 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
297. oncrete class strategy First you can use lt union subclass gt lt class name Payment gt lt id name id type long column PAYMENT_ID gt lt generator class sequence gt lt id gt lt property name amount column AMOUNT gt lt union subclass name CreditCardPayment table CREDIT_PAYMENT gt lt property name creditCardType column CCTYPE gt lt union subclass gt lt union subclass name CashPayment table CASH_PAYMENT gt lt union subclass gt lt union subclass name ChequePayment table CHEQUE_PAYMENT gt lt union subclass gt znelass gt Drei Tabellen sind f r die Subklassen involviert Jede Tabelle definiert Spalten f r alle Properties der Klasse einschlie lich vererbter Properties 148 Table per concrete class using implicit polymorphism The limitation of this approach is that if a property is mapped on the superclass the column name must be the same on all subclass tables The identity generator strategy is not allowed in union subclass inheritance The primary key seed has to be shared across all unioned subclasses of a hierarchy If your superclass is abstract map it with abst ract true If itis not abstract an additional table it defaults to PAYMENT in the example above is needed to hold instances of the superclass 9 1 6 Table per concrete class using implicit polymorphism Alternativ kann implizite Polymorphie angewendet werden lt class name Cr
298. one gt to one gt to to id Payment Order konkrete many gt many gt p o join Klasse for o payment Union inverse true p Subklasse only table per lt any gt not not lt many s createCfideria MGfment cnofs add Restrictions concrete supported supported to any gt Payment supported supported class p implicit polymorphism 151 152 Das Arbeiten mit Objekten Hibernate is a full object relational mapping solution that not only shields the developer from the details of the underlying database management system but also offers state management of objects This is contrary to the management of SQL statements in common JDBC SQL persistence layers a natural object oriented view of persistence in Java applications Mit anderen Worten Hibernate Anwendungsentwickler sollten sich stets ber den Status Ihrer Objekte Gedanken machen und nicht unbedingt ber die Ausf hrung von SQL Anweisungen Dieser Teil wird von Hibernate bernommen und ist nur dann f r den Anwendungsentwickler von Bedeutung wenn die Performance des Systems eingestellt wird 10 1 Statusarten von Hibernate Objekten Hibernate definiert und unterst tzt die folgenden Arten des Objektstatus e Transient an object is transient if it has just been instantiated using the new operator and it is not associated with a Hibernate session It has no persistent representation in the database and no identifier value has been assigned Transien
299. onen bei wechselnden Schl sseln u een 313 25 Optimale Verfahren 2 2 u a Raise dee leddele 315 26 Database Portability Considerations 4444444444H4nnnnnnnn nenn nnnnnnnnnnn 319 26 1 Portability Basics zu ee ee erenegan 319 26 2 Dialekt nern ne aeeeda a AEAN 319 26 3 Dialect resolution 22 22 euer 319 26 4 Identifier generation ur 444444H4nnannnnannnnnnnannnnnnnnnnnnnnnnnnnnnnnannnnennnnnnnennn nn 320 26 5 Database functions essen 321 26 6 Type MAPPINGS 440 02000000 erens EE RNA ENE a anna ea ae naar 321 References nenne tela ieee eta elektr 323 Vorwort Die Arbeit mit objektorientierter Software und einer relationalen Datenbank kann sich in Unternehmensumgebungen heutzutage als m hsam und zeitaufwendig erweisen Bei Hibernate handelt es sich um ein objekt relationales Mapping Tool f r Java Umgebungen Der Begriff objekt relationales Mapping ORM bezieht sich auf die Technik des Mappens einer Datenrepr sentation von einem Objektmodell zu einem relationalen Datenmodell mit SQL basiertem Schema Hibernate not only takes care of the mapping from Java classes to database tables and from Java data types to SQL data types but also provides data query and retrieval facilities It can also significantly reduce development time otherwise spent with manual data handling in SQL and JDBC Hibernate s goal is to relieve the
300. ons 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 increment generiert Bezeichner des Typs long short oder int die nur eindeutig sind wenn kein anderer Vorgang Daten derselben Tabelle hinzuf gt Nicht in einem Cluster zu verwenden 70 identity unterst tzt die Identitatsspalten in DB2 MySQL MS SQL Server Sybase und HypersonicSQL Der zur ckgesendete Bezeichner ist vom Typ long short Oder int sequence verwendet eine Sequenz in DB2 PostgreSQL Oracle SAP DB McKoi oder einen Generator in Interbase Der zur ckgeschickte Bezeichner ist vom Typ long short Oder int hilo verwendet einen hi lo Algorithmus um effizient Bezeichner des Typs long short oder int zu generieren bei gegebener Tabelle und Spalte Standardeinstellung lautet hibernate_unique_key bzw next_hi als Quelle der hi Werte Der hi lo Algorithmus generiert Bezeichner die f r eine bestimmte Datenbank eindeutig sind seqghilo verwendet einen hi lo Algorithmus um effizient Bezeichner des Typs long short oder int zu generieren bei einer vorgegebenen und benannten Datenbanksequenz uuid uses a 128 bit UUID algorithm to generate identifiers of type string that are unique within a network the IP address is used The UUID is encoded as a string of 32 hexadecimal digits in length guid verwendet einen von der Datenb
301. operty The placeholder for a column alias is just the property name qualified by the table alias In the following example you retrieve Cats and their mothers from a different table cat_log to the one declared in the mapping metadata You can even use the property aliases in the where clause Strung sql VSELBET ID as cid NAME as fe name I H BIRTHDATE as c birthDate MOTHER_ID as c mother mother FROM CAT_LOG c CAT_LOG m WHERE c mother c ID List loggedCats sess createSOLQuery sql addEntity cat Cat class addEntity mother Cat class list 17 1 4 1 Alias und Property Referenzen In most cases the above alias injection is needed For queries relating to more complex mappings like composite properties inheritance discriminators collections etc you can use specific aliases that allow Hibernate to inject the proper aliases The following table shows the different ways you can use the alias injection Please note that the alias names in the result are simply examples each alias will have a unique and probably different name when used Tabelle 17 1 Alias Einspeisungsnamen Beschreibung Syntax Beispiel Eine einfache aliasname A_NAME as item name Property propertyname Eine aliasname CURRENCY as item amount currency VALUE zusammengeseizte componentname as item amount value Property propertyname Diskriminator einer aliasname clas JISC as item class E
302. operty name name type string gt lt joined subclass gt lt class gt lt class name eg Dog gt lt li mapping for Dog could go here gt lt class gt lt hibernate mapping gt 90 Union subclass For information about inheritance mappings see Kapitel 9 Inheritance mapping 5 1 19 Union subclass 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 with a separate lt class gt declaration However if you wish use polymorphic associations e g an association to the superclass of your hierarchy you need to use the lt union subclass gt mapping For example lt union subclass name ClassName table tablename proxy ProxyInterface 290909899 lazy true false dynamic update true false dynamic insert true false schema schema catalog catalog extends SuperclassName abstract true false persister ClassName subselect SOL expression entity name EntityName node element name gt lt property gt lt union subclass name the fully qualified class name of the subclass table the name of the subclass table proxy optional specifies a class or interface to use for lazy initi
303. or BLACK SQL functions and aggregate functions are allowed in the having and order by Clauses if they are supported by the underlying database i e not in MySQL select cat from Cat cat join cat kittens kitten group by cat id cat name cat other cat properties having avg kitten weight gt 100 order by count kitten asc sum kitten weight desc Neither the group by clause nor the order by clause can contain arithmetic expressions Hibernate also does not currently expand a grouped entity so you cannot write group by cat if all properties of cat are non aggregated You have to list all non aggregated properties explicitly 15 13 Unteranfragen Fur Datenbanken die Unterauswahlen unterst tzen unterst tzt Hibernate innerhalb von Anfragen Unteranfragen Eine Unteranfrage muss eingeklammert sein oftmals durch einen SQL aggregierten Funktionsaufruf Selbst korrelierende Unteranfragen Unteranfragen die auf einen Alias in der auBerhalb liegenden Anfrage verweisen sind gestattet from Cat as fatcat where fatcat weight select avg cat weight from DomesticCat cat from DomesticCat as cat where cat name some select name nickName from Name as name from Cat as cat where not exists from Cat as mate where mate mate cat from DomesticCat as cat where cat name not in 222 HQL Beispiele select name nickName from Name as name select cat id select max kit weight from cat kitten kit from Cat
304. ors alter table author_work add constraint author_workFK1 foreign key work_id references works 24 3 Kunde Bestellung Produkt In this section we consider a model of the relationships between Customer Order Line Item and Product There is a one to many association between Customer and Order but how can you represent Order LineItem Product In the example LineItem is mapped as an association class representing the many to many association between Order and Product In Hibernate this is called a composite element name String date Date serialNumber String getldd long getidd long setQuantity quantity int getldd long setldLid long setidLid long getProductd Product setidCid long getNamed String getLineltemsd List setProductiproduct Product getSerialNumberd String setName_name String setLineltemstlineltems List setSerialNumber serialNumber String getOrdersd Set getCustomerd Customer customer orders setOrderstorders Set setCustomericustomer Customen getDated Date setDate date Date The mapping document will look like this lt hibernate mapping gt lt class name Customer table customers gt lt id name id gt lt generator class native gt ais lt property name name gt lt set name orders inverse true gt lt key column customer_id gt lt one to many class Order gt lt set gt lt class gt 307 Kap
305. ory lt attribute gt lt attribute name TransactionManagerLookupStrategy gt org hibernate transaction JBossTransactionManagerLookup lt attribute gt lt attribute name FlushBeforeCompletionEnabled gt true lt attribute gt lt attribute name AutoCloseSessionEnabled gt true lt attribute gt Si Teteng OPE TONS gt lt attribute name MaximumFetchDepth gt 5 lt attribute gt lt Second level caching gt lt attribute name SecondLevelCacheEnabled gt true lt attribute gt lt attribute name CacheProviderClass gt org hibernate cache EhCacheProvider lt attribute gt lt attribute name QueryCacheEnabled gt true lt attribute gt Logging gt lt attribute name ShowSqlEnabled gt true lt attribute gt Si Mapping files gt lt attribute name MapResources gt auction Item hbm xml auction Category hbm xml lt attribute gt lt mbean gt lt server gt This file is deployed in a directory called mETA InF and packaged in a JAR file with the extension sar service archive You also need to package Hibernate its required third party libraries your compiled persistent classes as well as your mapping files in the same archive Your enterprise beans usually session beans can be kept in their own JAR file but you can include this EJB JAR file in the main service archive to get a single hot deployable unit Consult the JBoss AS documentation for more information about JMX servic
306. ost purposes The properties of a component can be of any Hibernate type collections many to one associations other components etc Nested components should not be considered an exotic usage Hibernate is intended to support a fine grained object model Das lt component gt Element erm glicht ein lt parent gt Subelement das eine Property der Komponentenklasse als R ckreferenz zur enthaltenden Entity mappt lt class name eg Person table person gt lt id name Key column pid type string gt lt generator class uuid gt lt i gt lt property name birthday type date gt lt component name Name class eg Name unique true gt 138 Collections abh ngiger Objekte lt parent name namedPerson gt lt reference back to the Person gt lt property name initial gt lt property name first gt lt property name last gt lt component gt lt class gt 8 2 Collections abhangiger Objekte Collections of components are supported e g an array of type Name Declare your component collection by replacing the lt element gt tag with a lt composite element gt tag lt set name someNames table some_names lazy true gt lt key column id gt lt composite element class eg Name gt lt class attribute required gt lt property name initial gt lt property name first gt lt property name last gt lt composite element gt lt set gt 7 Wic
307. ot supported F r Oracle gelten die folgenden Regeln A function must return a result set The first parameter of a procedure must be an our that returns a result set This is done by using a sYS_REFCURSOR type in Oracle 9 or 10 In Oracle you need to define a REF CURSOR type See Oracle literature for further information F r Sybase oder MS SQL Server gelten die folgenden Regeln The procedure must return a result set Note that since these servers can return multiple result sets and update counts Hibernate will iterate the results and take the first result that is a result set as its return value Everything else will be discarded Falls Sie set nocounT on in Ihrer Prozedur aktivieren k nnen so w rde sie wahrscheinlich effizienter Dies ist jedoch keine Voraussetzung 17 3 Anwenderspezifische SQL f r create erstellen update aktualisieren und delete l schen Hibernate3 can use custom SQL for create update and delete operations The SQL can be overridden at the statement level or inidividual column level This section describes statement overrides For columns see Abschnitt 5 7 Column read and write expressions The class and collection persisters in Hibernate already contain a set of configuration time generated strings insertsql deletesql updatesgl etc The mapping tags lt sql insert gt lt sql delete gt and lt sql update gt override these strings lt class name Person gt lt id
308. ove it would look like this session enableFilter myFilter setParameter myFilterParam some value Methods on the org hibernate Filter interface do allow the method chaining common to much of Hibernate The following is a full example using temporal data with an effective record date pattern lt filter def name effectiveDate gt lt filter param name asOfDate type date gt lt filter def gt lt class name Employee gt lt many to one name department column dept_id class Department gt lt property name effectiveStartDate type date column eff_start_dt gt lt property name effectiveEndDate type date column eff_end_dt gt Gia Note that this assumes non terminal records have an eff_end_dt set to a max db date for simplicity sake gt lt filter name effectiveDate condition asOfDate BETWEEN eff_start_dt and eff_end_dt gt SNelass gt lt class name Department gt lt set name employees lazy true gt lt key column dept_id gt lt one to many class Employee gt lt filter name effectiveDate condition asOfDate BETWEEN eff_start_dt and eff_end_dt gt lt set gt lt class gt In order to ensure that you are provided with currently effective records enable the filter on the session prior to retrieving employee data Session session session enableFilter effectiveDate setParameter asOfDate new Date List results session createQ
309. ow 1 Integer count Integer row 2 10 4 1 4 Bind Parameter Methods on Query are provided for binding values to named parameters or JDBC style parameters Contrary to JDBC Hibernate numbers parameters from zero Named parameters are identifiers of the form name in the query string The advantages of named parameters are as follows benannte Parameter sind unempfindlich im Bezug auf die Reihenfolge in der sie im Anfragenstring erscheinen e they can occur multiple times in the same query sie dokumentieren sich selbst named parameter preferred Query q sess createQuery from DomesticCat cat where cat name name qg setStringi name TFritz y Iterator cats q iterate positional parameter Query q sess createQuery from DomesticCat cat where cat name q setString 0 Izi Iterator cats q iterate named parameter list List names new ArrayList names add Izi names add Fritz Query q sess createQuery from DomesticCat cat where cat name in namesList q setParameterList namesList names List cats g listy 10 4 1 5 Nummerierung If you need to specify bounds upon your result set that is the maximum number of rows you want to retrieve and or the first row you want to retrieve you can use methods of the Query interface 158 Ausf hren von Anfragen Query q sess createQuery from DomesticCat cat q setFirstResult 20 q setMa
310. own as session per conversation Hibernate checks instance versions at flush time throwing an exception if concurrent modification is detected It is up to the developer to catch and handle this exception Common options are the opportunity for the user to merge changes or to restart the business conversation with non stale data The Session is disconnected from any underlying JDBC connection when waiting for user interaction This approach is the most efficient in terms of database access The application does not version check or reattach detached instances nor does it have to reload instances in every database transaction foo is an instance loaded earlier by the old session Transaction t session beginTransaction Obtain a new JDBC connection start transaction foo setProperty bar session flush Only for last transaction in conversation E COmmiiste 3 ie Also return JDBC connection session close Only for last transaction in conversation The foo object knows which Session it was loaded in Beginning a new database transaction on an old session obtains a new connection and resumes the session Committing a database transaction disconnects a session from the JDBC connection and returns the connection to the pool After reconnection to force a version check on data you are not updating you can call Session lock With LockMode READ on any objects that might have been updated by another transaction You do not nee
311. oxying by setting lazy false 4 1 4 Zugriffsberechtigte und Mutatoren fur persistente Felder deklarieren optional Cat declares accessor methods for all its persistent fields Many other ORM tools directly persist instance variables It is better to provide an indirection between the relational schema and internal data structures of the class By default Hibernate persists JavaBeans style properties and recognizes method names of the form get Foo isFoo and set Foo If required you can switch to direct field access for particular properties Properties m ssen nicht als ffentlich deklariert werden Hibernate kann eine Property als protected oder private Get Set Paar persistieren 4 2 Implementierung der Vererbung A subclass must also observe the first and second rules It inherits its identifier property from the superclass Cat For example 55 Kapitel 4 Persistente Klassen package eg public class DomesticCat extends Cat private String name public String getName return name protected void setName String name this name name 4 3 Implementing equais ANA nasncode You have to override the equals and hashCode methods if you e intend to put instances of persistent classes in a Set the recommended way to represent many valued associations and e planen den Wiederanbindung abgesetzter Instanzen zu verwenden Hibernate guarantees equivalence of persistent identity
312. parameter defines which org hibernate context CurrentSessionContext implementation should be used For backwards compatibility if this configuration parameter is not set but a org hibernate transaction Transact ionManagerLookup IS configured Hibernate will use the org hibernate context JTASessionContext Typically the value of this parameter would just name the implementation class to use For the three out of the box implementations however there are three corresponding short names jta thread and managed 32 Konfiguration Hibernate is designed to operate in many different environments and as such there is a broad range of configuration parameters Fortunately most have sensible default values and Hibernate is distributed with an example hibernate properties file in etc that displays the various options Simply put the example file in your classpath and customize it to suit your needs 3 1 Programmatische Konfiguration An instance of org hibernate cfg Configuration represents an entire set of mappings of an application s Java types to an SQL database The org hibernate cfg Configuration IS used to build an immutable org hibernate SessionFactory The mappings are compiled from various XML mapping files You can obtain a org hibernate cfg Configuration instance by instantiating it directly and specifying XML mapping documents If the mapping files are in the classpath use addResource For example Configura
313. perclass table so the relational model is actually a one to one association 146 Table per subclass using a discriminator 9 1 3 Table per subclass using a discriminator Hibernate s implementation of table per subclass does not require a discriminator column Other object relational mappers use a different implementation of table per subclass that requires a type discriminator column in the superclass table The approach taken by Hibernate is much more difficult to implement but arguably more correct from a relational point of view If you want to use a discriminator column with the table per subclass strategy you can combine the use of lt subclass gt and lt join gt as follows lt class name Payment table PAYMENT gt lt id name id type long column PAYMENT_ID gt lt generator class native gt lt id gt lt discriminator column PAYMENT_TYPE type string gt lt property name amount column AMOUNT gt lt subclass name CreditCardPayment discriminator value CREDIT gt lt join table CREDIT_PAYMENT gt lt key column PAYMENT_ID gt lt property name creditCardType column CCTYPE gt lt join gt lt subclass gt lt subclass name CashPayment discriminator value CASH gt lt join table CASH_PAYMENT gt lt key column PAYMENT_ID gt lt join gt lt subclass gt lt subclass name ChequePayment discriminator value CHEQUE gt lt join table CHEQUE_PAYMENT fetch select
314. ple backend gt lt dependency gt lt groupId gt org slf4j lt grouplId gt lt artifactId gt slf4j simple lt artifactId gt lt dependency gt lt Hibernate gives you a choice of bytecode providers between cglib and javassist gt lt dependency gt lt grouplId gt javassist lt grouplId gt lt artrraceTd gt javassist lt artifactId gt lt dependency gt lt dependencies gt lt project Die erste Klasse Tipp It is not a requirement to use Maven If you wish to use something else to build this tutorial such as Ant the layout will remain the same The only change is that you will need to manually account for all the needed dependencies If you use something like http ant apache org ivy providing transitive dependency management you would still use the dependencies mentioned below Otherwise you d need to grab all dependencies both explicit and transitive and add them to the project s classpath If working from the Hibernate distribution bundle this would mean hibernate3 jar all artifacts in the 1ib requirea directory and all files from either the 1ib bytecode cglib Or lib bytecode javassist directory additionally you will need both the servlet api jar and one of the slf4j logging backends Save this file as pom xm1 in the project root directory 1 1 2 Die erste Klasse Next we create a class that represents the event we want to store in the database it is a simple JavaBean class wit
315. ployee EMPLOYER AS emp employer STARTDATE AS emp startDate ENDDATE AS emp endDate REGIONCODE as emp regionCode EID AS emp id VALUE CURRENCY FROM EMPLOYMENT WHERE EMPLOYER id AND ENDDATE IS NULL ORDER BY STARTDATE ASC lt sql query gt In this example lt return property gt was used in combination with the syntax for injection This allows users to choose how they want to refer column and properties Falls Ihr Mapping ber einen Diskriminator verf gt so m ssen Sie lt return discriminator gt verwenden um die Diskriminator Spalte festzulegen 17 2 2 Die Verwendung gespeicherter Prozeduren f r Anfragen Hibernate3 provides support for queries via stored procedures and functions Most of the following documentation is equivalent for both The stored procedure function must return a resultset as 244 Die Verwendung gespeicherter Prozeduren f r Anfragen the first out parameter to be able to work with Hibernate An example of such a stored function in Oracle 9 and higher is as follows CREATE OR REPLACE FUNCTION selectAllEmployments RETURN SYS_REFCURSOR AS st_eursor SYS_REFCURSOR BEGIN OPEN st cursor FOR SELECT EMPLOYEE EMPLOYER STARTDATE ENDDATE REGIONCODE EID VALUE CURRENCY FROM EMPLOYMENT RETURN st Cursor END Um diese Anfrage in Hibernate zu verwenden m ssen Sie sie durch eine benannte Anfrage mappen lt sql query name selectAllEmployees_SP callable true gt lt return
316. pping gt Kapitel 1 Tutorial The id element is the declaration of the identifier property The name id mapping attribute declares the name of the JavaBean property and tells Hibernate to use the get Id and setId methods to access the property The column attribute tells Hibernate which column of the EVENTS table holds the primary key value The nested generator element specifies the identifier generation strategy aka how are identifier values generated In this case we choose native which offers a level of portability depending on the configured database dialect Hibernate supports database generated globally unique as well as application assigned identifiers Identifier value generation is also one of Hibernate s many extension points and you can plugin in your own strategy Tipp A native is no longer consider the best strategy in terms of portability for further discussion see Lastly we need to tell Hibernate about the remaining entity class properties By default no properties of the class are considered persistent lt hibernate mapping package org hibernate tutorial domain gt lt class name Event table EVENTS gt lt id name id column EVENT_ID gt lt generator class native gt lt id gt lt property name date type timestamp column EVENT_DATE gt lt property name title gt lt class gt lt hibernate mapping gt Similar to the ia element the name attribu
317. r in this chapter The discussion of concurrency control in Hibernate begins with the granularity of configuration SessionFactory and Session as well as database transactions and long conversations 12 1 Gultigkeitsbereiche von Session und Transaktion A SessionFactory is an expensive to create threadsafe object intended to be shared by all application threads It is created once usually on application startup from a Configuration instance A Session is an inexpensive non threadsafe object that should be used once and then discarded for a single request a conversation or a single unit of work A Session will not obtain a JDBC Connection Of A Datasource unless it is needed It will not consume any resources until used In order to reduce lock contention in the database a database transaction has to be as short as possible Long database transactions will prevent your application from scaling to a highly concurrent load It is not recommended that you hold a database transaction open during user think time until the unit of work is complete What is the scope of a unit of work Can a single Hibernate session span several database transactions or is this a one to one relationship of scopes When should you open and close a Session and how do you demarcate the database transaction boundaries These questions are addressed in the following sections 12 1 1 Arbeitseinheit First let s define a unit of work A unit of
318. r the SQLExcept ionConverterFactory Class for details The standard JDBCExcept ion subtypes are e JDBCConnectionException indicates an error with the underlying JDBC communication SQLGrammarException indicates a grammar or syntax problem with the issued SQL ConstraintViolationException indicates some form of integrity constraint violation LockAcquisitionException indicates an error acquiring a lock level necessary to perform the requested operation e GenericJDBCExcept ion a generic exception which did not fall into any of the other categories 12 2 4 Transaktions Timeout An important feature provided by a managed environment like EJB that is never provided for non managed code is transaction timeout Transaction timeouts ensure that no misbehaving transaction can indefinitely tie up resources while returning no response to the user Outside a managed JTA environment Hibernate cannot fully provide this functionality However Hibernate can at least control data access operations ensuring that database level deadlocks and queries with huge result sets are limited by a defined timeout In a managed environment Hibernate can delegate transaction timeout to JTA This functionality is abstracted by the Hibernate Transaction object Session sess factory openSession try set transaction timeout to 3 seconds sess getTransaction setTimeout 3 sess getTransaction begin
319. rceptor new AuditInterceptor 13 2 Ereignissystem If you have to react to particular events in your persistence layer you can also use the Hibernate3 event architecture The event system can be used in addition or as a replacement for interceptors All the methods of the session interface correlate to an event You have a LoadEvent a FlushEvent etc Consult the XML configuration file DTD or the org hibernate event package for the full list of defined event types When a request is made of one of these methods the Hibernate Session generates an appropriate event and passes it to the configured event listeners for that type Out of the box these listeners implement the same processing in which those methods always resulted However you are free to implement a customization of one of the listener interfaces i e the LoadEvent is processed by the registered implementation of the LoadEventListener interface in which case their implementation would be responsible for processing any load requests made of the Session The listeners should be considered singletons This means they are shared between requests and should not save any state as instance variables A custom listener implements the appropriate interface for the event it wants to process and or extend one of the convenience base classes or even the default event listeners used by Hibernate out of the box as these are declared non final for this purpose Custom liste
320. rease performance by limiting the number of round trips to and from the database This is however at the cost of possibly more work performed by the database itself Outer join fetching allows a whole graph of objects connected by many to one one to many many to many and one to one associations to be retrieved in a single SQL SELECT Outer join fetching can be disabled globally by setting the property hibernate max_fetch_depth to o A setting of 1 or higher enables outer join fetching for one to one and many to one associations that have been mapped with fetch join See Abschnitt 20 1 Abrufstrategien for more information 3 4 3 Bin re Datenstr me Oracle limits the size of byte arrays that can be passed to and or from its JDBC driver If you wish to use large instances of binary Of serializable type you should enable hibernate jdbc use_streams_for_binary This is a system level setting only 3 4 4 Zweite Ebene und Anfragen Cache The properties prefixed by hibernate cache allow you to use a process or cluster scoped second level cache system with Hibernate See the Abschnitt 20 2 Das Cache der zweiten Ebene for more information 3 4 5 Query Language Substitution You can define new Hibernate query tokens using hibernate query substitutions For example hibernate query substitutions true 1 false 0 44 Die Hibernate Statistik This would cause the tokens true and false to be translat
321. reating and making use of src main java src main resources and src main webapp directories We will be using Maven in this tutorial taking advantage of its transitive dependency management capabilities as well as the ability of many IDEs to automatically set up a project for us based on the maven descriptor Kapitel 1 Tutorial lt project xmlns http maven apache org POM 4 0 0 xmlns xsi http www w3 org 2001 XMLSchema instance xsi schemaLocation http maven apache org POM 4 0 0 http maven apache org xsd maven 4 0 0 xsd gt lt modelVersion gt 4 0 0 lt modelVersion gt lt grouplId gt org hibernate tutorials lt groupId gt lt anbatectikd gt hibernate tutorial lt artifactId gt lt version gt 1 0 0 SNAPSHOT lt version gt lt name gt First Hibernate Tutorial lt name gt lt build gt lt we dont want the version to be part of the generated war file name gt lt finalName gt artifactId lt finalName gt lt build gt lt dependencies gt lt dependency gt lt grouplId gt org hibernate lt groupId gt lt artifactId gt hibernate core lt artifactId gt lt dependency gt lt Because this is a web app we also have a dependency on the servlet api gt lt dependency gt lt grouplId gt javax servlet lt grouplId gt lt artifactId gt servlet api lt artifactId gt lt dependency gt lt Hibernate uses slf4j for logging for our purposes here use the sim
322. ref person gt lt class gt Das funktioniert sogar mit gespeicherten Prozeduren You can even define a query for collection loading lt set name employments inverse true gt lt key gt lt one to many class Employment gt lt loader query ref employments gt lt set gt lt sql query name employments gt lt load collection alias emp role Person employments gt SELECT emp FROM EMPLOYMENT emp WHERE EMPLOYER id ORDER BY STARTDATE ASC EMPLOYEE ASC lt sql query gt You can also define an entity loader that loads a collection by join fetching lt sql query name person gt lt return alias pers class Person gt lt return join alias emp property pers employments gt SELECT NAME AS pers emp FROM PERSON pers LEFT OUTER JOIN EMPLOYMENT emp 248 Angepasste SQL f r das Laden ON pers ID emp PERSON_ID WHERE ID lt sql query gt 249 250 Das Filtern von Daten Hibernate3 provides an innovative new approach to handling data with visibility rules A Hibernate filter is a global named parameterized filter that can be enabled or disabled for a particular Hibernate session 18 1 Hibernate Filter Hibernate3 has the ability to pre define filter criteria and attach those filters at both a class level and a collection level A filter criteria allows you to define a restriction clause similar to the existing where attribute available on th
323. ria avgWeight DetachedCriteria forClass Cat class setProjection Property forName weight avg session createCriteria Cat class add Property forName weight gt avgWeight List DetachedCriteria weights DetachedCriteria forClass Cat class setProjection Property forName weight session createCriteria Cat class add Subqueries geAll weight weights Listy Correlated subqueries are also possible DetachedCriteria avgWeightForSex DetachedCriteria forClass Cat class cat2 setProjection Property forName weight avg add Property forName cat2 sex eqProperty cat sex session createCriteria Cat class cat add Property forName weight gt avgWeightForSex ailne e 235 Kapitel 16 Criteria Queries 16 9 Anfrage ber nat rlichen Bezeichner For most queries including criteria queries the query cache is not efficient because query cache invalidation occurs too frequently However there is a special kind of query where you can optimize the cache invalidation algorithm lookups by a constant natural key In some applications this kind of query occurs frequently The criteria API provides special provision for this use case First map the natural key of your entity using lt natural id gt and enable use of the second level cache lt class name User gt lt cache usage read write gt lt id name id gt lt generator class increment gt lt
324. rice amount gt minAmount order by sum price amount desc Monstr s Im wirklichen Leben bin ich kein gro er Freund von Unteranfragen daher sieht meine Anfrage eher wie folgt aus 223 Kapitel 15 HQL Die Hiberna select order id sum price amount count item from Order as order join order lineltems as item join item product as product Catalog as catalog join catalog prices as price where order paid false and order customer customer and price product product and catalog currentCatalog group by order having sum price amount gt minAmount order by sum price amount desc Die n chste Anfrage z hlt die Anzahl von Zahlungen in jedem Status wobei Zahlungen mit AWAITING_APPROVAL Status bei denen die aktuellste Status nderung durch den Benutzer vorgenommen wurde ausgenommen sind Sie wird in eine SQL Anfrage mit zwei inneren Verb nden und eine korrelierte Unterauswahl an die PAYMENT PAYMENT_STATUS_CHANGE Tabellen bersetzt select count payment status name from Payment as payment join payment currentStatus as status join payment statusChanges as statusChange where payment status name lt gt PaymentStatus AWAITING_APPROVAL ehe statusChange timeStamp select max change timeStamp from PaymentStatusChange change where change payment payment and statusChange user lt gt SeurrentUser group by status name status sortOrder order by status sortOrder
325. rimary key column 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 access optional defaults to property the strategy Hibernate should use for accessing the property value Falls das name Attribut fehlt wird davon ausgegangen dass die Klasse keine Bezeichner Property besitzt Das unsaved value Attribut wird in Hibernate3 fast nie ben tigt There is an alternative lt composite id gt declaration that allows access to legacy data with composite keys Its use is strongly discouraged for anything else 5 1 4 1 Programmgenerator Das optionale lt generator gt Unterelement benennt eine Java Klasse die zur Generierung eindeutiger Bezeichner f r Instanzen der persistenten Klasse verwendet werden Falls Parameter zur Konfiguration oder Initialisierung der Generatorinstanz ben tigt werden werden Sie unter Verwendung des lt param gt Elements weitergeleitet lt id name id type long column cat_id gt lt generator class org hibernate id TableHiLoGenerator gt lt param name table gt uid_table lt param gt lt param name column gt next_hi_value_column lt param gt lt generator gt lt fid gt All generators implement the interface org hibernate id IdentifierGenerator This is a very simple interface Some applicati
326. rintin lt p 22 Bearbeitung und Rendering gt lt i gt Please enter event title and date lt i gt lt b else a gt Added event lt i gt lt b ey if Print createAndStoreEvent eventTitle dateFormatter parse eventDate out printi lt p page printEventForm out listEvents out dateFormatter Write HTML footer out printin lt body gt lt html zT oute Elch out close 0 QO This coding style with a mix of Java and HTML would not scale in a more complex application keep in mind that we are only illustrating basic Hibernate concepts in this tutorial The code prints an HTML header and a footer Inside this page an HTML form for event entry and a list of all events in the database are printed The first method is trivial and only outputs HTML private void printEventForm PrintWriter out out prin tlin lt h2 gt Add new event lt h2 a out prin zur out prin out print out print out prin Se ELNI lt Form tIn Title lt input name eventTitle length 50 gt lt br gt In Date e g 24 12 2009 lt input name eventDate length 10 gt lt br gt tln lt input type submit name action value store gt Glin lt form Die listEvents Methode verwendet die an den aktuellen Thread gebundene Hibernate Session bei der Ausf hrung einer Abfrage private void listEvents PrintWriter out SimpleDat
327. rnate context JTASessionContext Current sessions are tracked and scoped by a JTA transaction The processing here is exactly the same as in the older JTA only approach See the Javadocs for details e org hibernate context ThreadLocalSessionContext current sessions are tracked by thread of execution See the Javadocs for details org hibernate context ManagedSessionContext current sessions are tracked by thread of execution However you are responsible to bind and unbind a Session instance with static methods on this class it does not open flush or close a Session 31 Kapitel 2 Architektur The first two implementations provide a one session one database transaction programming model This is also known and used as session per request The beginning and end of a Hibernate session is defined by the duration of a database transaction If you use programmatic transaction demarcation in plain JSE without JTA you are advised to use the Hibernate Transaction API to hide the underlying transaction system from your code If you use JTA you can utilize the JTA interfaces to demarcate transactions If you execute in an EJB container that supports CMT transaction boundaries are defined declaratively and you do not need any transaction or session demarcation operations in your code Refer to Kapitel 12 Transactions and Concurrency for more information and code examples The hibernate current_session_context_class configuration
328. ruly bidirectional That is there is information available at one end of the association that is not available at the other end In this case you cannot map the collection inverse true Instead you could use the following mapping lt class name Parent gt lt id name id column parent_id gt lt map name children gt lt key column parent_id not null true gt lt map key column name type string gt lt one to many class Child gt lt map gt lt class gt lt class name Child gt lt id name id column child_id gt lt many to one name parent class Parent column parent_id insert false 118 Dreifache Assoziationen update false not null true gt lt class Note that in this mapping the collection valued end of the association is responsible for updates to the foreign key 6 3 4 Dreifache Assoziationen There are three possible approaches to mapping a ternary association One approach is to use a Map with an association as its index lt map name contracts gt lt key column employer_id not null true gt lt map key many to many column employee_id class Employee gt lt one to many class Contract gt lt map gt lt map name connections gt lt key column incoming_node_id gt lt map key many to many column outgoing_node_id class Node gt lt many to many column connection_id class Connection gt lt map gt A
329. ry try Create the SessionFactory from hibernate cfg xml return new Configuration configure buildSessionFactory catch Throwable ex Make sure you log the exception as it might be swallowed System err println Initial SessionFactory creation failed ex throw new ExceptionInInitializerError ex public static SessionFactory getSessionFactory return sessionFactory Save this code as src main java org hibernate tutorial util HibernateUtil java This class not only produces the global org hibernate SessionFactory reference in its static initializer it also hides the fact that it uses a static singleton We might just as well have looked up 10 Das Laden und Speichern von Objekten the org hibernate SessionFactory reference from JNDI in an application server or any other location for that matter If you give the org hibernate SessionFactory a name in your configuration Hibernate will try to bind it to JNDI under that name after it has been built Another better option is to use a JMX deployment and let the JMX capable container instantiate and bind a HibernateService to JNDI Such advanced options are discussed later You now need to configure a logging system Hibernate uses commons logging and provides two choices Log4j and JDK 1 4 logging Most developers prefer Log4j copy 10g44 properties from the Hibernate distribution in the etc directory to your src directory next to hibernate cfg
330. s from Show show where fizard in indices show acts Note that these constructs size elements indices minindex maxindex minelement maxelement can only be used in the where clause in Hibernate3 Elements of indexed collections arrays lists and maps can be referred to by index in a where clause only 219 Kapitel 15 HQL Die Hiberna from Order order where order items 0 id 1234 select person from Person person Calendar calendar where calendar holidays national day person birthDay and person nationality calendar calendar select item from Item item Order order where order items order deliveredItemIndices 0 item and order id 11 select item from Item item Order order where order items maxindex order items item and order id 11 The expression inside can even be an arithmetic expression select item from Item item Order order where order items size order items 1 item HQL also provides the built in index function for elements of a one to many association or collection of values select item index item from Order order join order items item where index item lt 5 Scalar SQL functions supported by the underlying database can be used from DomesticCat cat where upper cat name like FRI Consider how much longer and less readable the following query would be in SQL seleet eust from Product prod Store store inner join store customers cust
331. s gt Then proxies for instances of cat and DomesticcCat can be returned by load Ofiterate Cat cat Cat session load CatImpl class catid Iterator iter session createQuery from CatImpl as cat where cat name fritz iterate j Cat fritz Cat iter next 5 Note list does not usually return proxies Beziehungen werden ebenfalls lazy initialisiert Das bedeutet dass Sie s mtliche Properties als Typ Cat nicht cat Imp1 deklarieren m ssen Certain operations do not require proxy initialization equals if the persistent class does not override equals hashCode if the persistent class does not override hashCode Die Getter Methode des Bezeichners Hibernate erkennt persistente Klassen die equals oder hashCode au er Kraft setzen By choosing lazy no proxy instead of the default lazy proxy you can avoid problems associated with typecasting However buildtime bytecode instrumentation is required and all operations will result in immediate proxy initialization 265 Kapitel 20 Verbesserung der 20 1 4 Initialisierung von Collections und Proxies A LazyInitializationException Will be thrown by Hibernate if an uninitialized collection or proxy is accessed outside of the scope of the session i e when the entity owning the collection or having the reference to the proxy is in the detached state Sometimes a proxy or collection needs to be initialized before
332. s need an index column in the collection table An index column is a column that maps to an array index or List index Or Map key The index of a Map may be of any basic type mapped with lt map key gt It can be an entity reference mapped with lt map key many to many gt or it can be a composite type mapped with lt composite map key gt The index of an array or list is always of type integer and is mapped using the lt list index gt element The mapped column contains sequential integers that are numbered from zero by default lt list index column column_name 110 Collections von Werten und Many to Many Assoziationen base 0 1 gt column_name required the name of the column holding the collection index values base optional defaults to 0 the value of the index column that corresponds to the first element of the list or array lt map key column column_name formula any SOL expression oo 90 type type_name node attribute name length N gt column optional the name of the column holding the collection index values formula optional a SQL formula used to evaluate the key ofthe map type required the type of the map keys lt map key many to many column column_name formula any SQL expression 213 class ClassName column optional the name of the foreign key column for the collection index values formula optional a SQ formula us
333. s you should ensure that the transaction is completed when Session close Of Session disconnect is called If you want to use this strategy ina cluster you should ensure that the underlying cache implementation supports locking The built in cache providers do not support locking lt class n ame eg Cat gt lt cache usage read write gt lt set name kittens gt lt cache usage read write gt lt set gt lt class gt 20 2 4 Strategie nonstrict read write If the application only occasionally needs to update data i e if it is extremely unlikely that two transactions would try to update the same item simultaneously and strict transaction isolation is not required a nonstrict read write cache might be appropriate If the cache is used in a JTA environment you must specify hibernate transaction manager_lookup_class In other environments you should ensure that the transaction is completed when session close Or Session disconnect Is called 272 Strategie transaktional 20 2 5 Strategie transaktional The transactional Cache strategy provides support for fully transactional cache providers such as JBoss TreeCache Such a cache can only be used in a JTA environment and you must specify hibernate transaction manager_lookup_class 20 2 6 Cache provider concurrency strategy compatibility 7 S Wichtig None of the cache providers support all of the cache concurrency strategies
334. s implementation However you lose compile time type checking and will likely deal with many exceptions at runtime As a result of the Hibernate mapping the 58 Tuplizer database schema can easily be normalized and sound allowing to add a proper domain model implementation on top later on Die Modi f r die Entity Repr sentation k nnen auch auf per Session Basis eingestellt werden Session dynamicSession pojoSession getSession EntityMode MAP Create a customer Map david new HashMap david put name David dynamicSession save Customer david dynamicSession flush j dynamicSession close Continue on pojoSession Please note that the call to getSession using an EntityMode is on the Session API not the SessionFactory That way the new Session shares the underlying JDBC connection transaction and other context information This means you do not have to call flush and close on the secondary Session and also leave the transaction and connection handling to the primary unit of work More information about the XML representation capabilities can be found in Kapitel 19 XML Mapping 4 5 Tuplizer org hibernate tuple Tuplizer and its sub interfaces are responsible for managing a particular representation of a piece of data given that representation s org hibernate EntityMode If a given piece of data is thought of as a data structure then a tuplizer is the thing that knows how to
335. s mapping file in place It is now time to configure Hibernate First let s set up HSQLDB to run in server mode We will utilize the Maven exec plugin to launch the HSQLDB server by running mvn exec java Dexec mainClass org hsqldb Server Dexec args database O file target data tutorial You will see it start up and bind to a TCP IP socket this is where our application will connect later If you want to start with a fresh database during this tutorial shutdown HSQLDB delete all files in the target data directory and start HSQLDB again Hibernate will be connecting to the database on behalf of your application so it needs to know how to obtain connections For this tutorial we will be using a standalone connection pool as opposed to a javax sql DataSource Hibernate comes with support for two third party open source JDBC connection pools c3p0 https sourceforge net projects c3p0 and proxoo http proxool sourceforge net However we will be using the Hibernate built in connection pool for this tutorial Kapitel 1 Tutorial For Hibernate s configuration we can use a simple hibernate properties file a more sophisticated hibernate cfg xml file or even complete programmatic setup Most users prefer the XML configuration file lt xml version 1 0 encoding utf 8 gt lt DOCTYPE hibernate configuration PUBLIC Hibernate Hibernate Configuration DTD 3 0 EN http hibernate sourceforge net hibernate
336. sId bigint not null primary key 7 3 2 Many to one A unidirectional many to one association on a join table is common when the association is optional For example lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt join table PersonAddress optional true gt lt key column personId unique true gt lt many to one name address column addressId not null true gt lt join gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt class gt create table Person personId bigint not null primary key create table PersonAddress personId bigint not null primary key addressId bigint not null create table Address addressId bigint not null primary key 7 3 3 One to one A unidirectional one to one association on a join table is possible but extremely unusual lt class name Person gt 128 Many to many lt id name id column personId gt lt generator class native gt Sy sie lt join table PersonAddress optional true gt lt key column personId unique true gt lt many to one name address column addressId not null true unique true gt lt jein gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt class gt create table
337. se and will not know how to handle version numbers or even timestamps In both cases versioning cannot rely on a particular column in a table To force a version check with a comparison of the state of all fields in a row but without a version or timestamp property 192 Pessimistic locking mapping turn on optimistic lock all inthe lt class gt mapping This conceptually only works if Hibernate can compare the old and the new state i e if you use a single long Session and not session per request with detached objects Concurrent modification can be permitted in instances where the changes that have been made do not overlap If you set optimist ic lock dirty when mapping the lt class gt Hibernate will only compare dirty fields during flush In both cases with dedicated version timestamp columns or with a full dirty field comparison Hibernate uses a single UPDATE statement with an appropriate WHERE Clause per entity to execute the version check and update the information If you use transitive persistence to cascade reattachment to associated entities Hibernate may execute unnecessary updates This is usually not a problem but on update triggers in the database might be executed even when no changes have been made to detached instances You can customize this behavior by setting select before update true in the lt class gt mapping forcing Hibernate to sELECT the instance to ensure that changes did occur before updating t
338. se schema catalog optional the name of a database catalog 65 Kapitel 5 Grundlagen des O R 8 O 69 default cascade optional defaults to none a default cascade style mapping document If you have two persistent classes with the same unqualified name you should set auto import false An exception will result if you attempt to assign two classes to the same imported name The hibernate mapping element allows you to nest several persistent lt class gt 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 xm1 or if using inheritance Animal hbm xml 5 1 3 Class You can declare a persistent class using the class element For example lt class name ClassName table tableName discriminator value discriminator_value mutable true false schema owner catalog catalog proxy ProxyInterface dynamic update true false dynamic insert true false select before update true false polymorphism implicit explicit where arbitrary sql where condition persister PersisterClass batch size N optimistic lock none version dirtylall lazy true false entity name EntityName check arbitrary sql check condition rowid rowid subselect SQOL expression abstract true fals
339. second approach is to remodel the association as an entity class This is the most common approach A final alternative is to use composite elements which will be discussed later 6 3 5 Using an lt idbag gt The majority of the many to many associations and collections of values shown previously all map to tables with composite keys even though it has been have suggested that entities should have synthetic identifiers surrogate keys A pure association table does not seem to benefit much from a surrogate key although a collection of composite values might It is for this reason that Hibernate provides a feature that allows you to map many to many associations and collections of values to a table with a surrogate key The lt idbag gt element lets you map a List Or Collection with bag semantics For example lt idbag name lovers table LOVERS gt lt collection id column ID type long gt lt generator class sequence gt lt collection id gt 119 Kapitel 6 Collection mapping lt key column PERSON1 gt lt many to many column PERSON2 class Person fetch join gt lt idbag gt An lt idbag gt has a synthetic id generator just like an entity class A different surrogate key is assigned to each collection row Hibernate does not however provide any mechanism for discovering the surrogate key value of a particular row The update performance of an lt idbag gt Supersedes a regular lt bag gt
340. sel verwendet werden from Person p order by p name from Person p order by p name first Another common use of components is in row value constructors 15 18 Die Syntax des Row Value Constructors HQL supports the use of ANSI SQL row value constructor syntax sometimes referred to AS tuple syntax even though the underlying database may not support that notion Here we are generally referring to multi valued comparisons typically associated with components Consider an entity Person which defines a name component 227 Kapitel 15 HQL Die Hiberna from Person p where p name first John and p name last Jingleheimer Schmidt That is valid syntax although it is a little verbose You can make this more concise by using row value constructor syntax from Person p where p name John Jingleheimer Schmidt Es kann sich als n tzlich erweisen dies in der select Klausel zu spezifizieren select p name from Person p Using row value constructor syntax can also be beneficial when using subqueries that need to compare against multiple values from Cat as cat where not cat name cat color in select cat name cat color from DomesticCat cat One thing to consider when deciding if you want to use this syntax is that the query will be dependent upon the ordering of the component sub properties in the metadata 228 Criteria Queries Hibernate besitzt eine intuitive erweiterbare Criteria Query A
341. serGroup gt lt key gt lt column name userName gt lt column name org gt lt key gt lt many to many class Group gt lt column name groupName gt lt formula gt org lt formula gt lt many to many gt lt set gt lt class gt lt class name Group table Group gt lt composite id gt lt key property name name gt lt key property name org gt lt composite id gt lt property name description gt lt set name users table UserGroup inverse true gt lt key gt lt column name groupName gt lt column name org gt lt key gt lt many to many class User gt lt column name userName gt lt formula gt org lt formula gt lt many to many gt lt set gt lt class gt 24 4 4 Inhaltsbasierte Diskriminierung lt class name Person discriminator value P gt lt id name id column person_id unsaved value 0 gt lt generator class native gt lt id gt lt discriminator 312 Assoziationen bei wechselnden Schl sseln type character gt lt formula gt case when title is not null then when salesperson is not null then else P end lt formula gt lt discriminator gt lt property name name not null true length 80 gt lt property name sex not null true update false gt lt component name address gt lt property name address gt lt property name zip gt lt property name country
342. session factory openSession Transaction t session beginTransaction int oldVersion foo getVersion session load foo foo getKey load the current state if oldVersion foo getVersion throw new StaleObjectStateException foo setProperty bar t commit session close Die version Property wird unter Verwendung von lt version gt gemappt und Hibernate wird diese wahrend des Raumens automatisch inkrementieren falls die Entity aufgrund eines Zugriffs als dirty erkannt wird If you are operating in a low data concurrency environment and do not require version checking you can use this approach and skip the version check In this case last commit wins is the default strategy for long conversations Be aware that this might confuse the users of the application as they might experience lost updates without error messages or a chance to merge conflicting changes 190 Erweiterte Session und automatische Versionierung Manual version checking is only feasible in trivial circumstances and not practical for most applications Often not only single instances but complete graphs of modified objects have to be checked Hibernate offers automatic version checking with either an extended Session or detached instances as the design paradigm 12 3 2 Erweiterte Session und automatische Versionierung Asingle session instance and its persistent instances that are used forthe whole conversation are kn
343. session clear tx commit session close 14 3 Das Interface der StatelessSession Alternatively Hibernate provides a command oriented API that can be used for streaming data to and from the database in the form of detached objects A statelessSession has no persistence context associated with it and does not provide many of the higher level life cycle semantics In particular a stateless session does not implement a first level cache nor interact with any second level or query cache It does not implement transactional write behind or automatic dirty checking Operations performed using a stateless session never cascade to associated instances Collections are ignored by a stateless session Operations performed via a stateless session bypass Hibernate s event model and interceptors Due to the lack of a first level cache Stateless sessions are vulnerable to data aliasing effects A stateless session is a lower level abstraction that is much closer to the underlying JDBC 204 Vorg nge im DML Stil StatelessSession session sessionFactory openStatelessSession Transaction tx session beginTransaction ScrollableResults customers session getNamedQuery GetCustomers scroll ScrollMode FORWARD_ONLY while customers next Customer customer Customer customers get 0 customer updateStuff session update customer tx commit session close In this code example the customer
344. shipped with Hlbernate itself it allows you to specify to use a custom dialect when a particular database is recognized etc To register one or more resolvers simply specify them seperated by commas tabs or spaces using the hibernate dialect_resolvers configuration setting see the DIALECT_RESOLVERS constant on org hibernate cfg Environment 26 4 Identifier generation When considering portability between databases another important decision is selecting the identifier generation stratagy you want to use Originally Hibernate provided the native generator for this purpose which was intended to select between a sequence identity or table strategy depending on the capability of the underlying database However an insidious implication of this approach comes about when targtetting some databases which support identity generation and some which do not identity generation relies on the SQL definition of an IDENTITY or auto increment column to manage the identifier value it is what is known as a post insert generation strategy becauase the insert must actually happen before we can know the identifier value Because Hibernate relies on this identifier value to uniquely reference entities within a persistence context it must then issue the insert immediately when the users requests the entitiy be associated with the session like via save e g regardless of current transactional semantics 5 Anmerkung Hibernate was c
345. sion is designed to represent a single unit of work a single atomic piece of work to be performed For now we will keep things simple and assume a one to one granularity between a Hibernate org hibernate Session and a database transaction To shield our code from the actual underlying transaction system we use the Hibernate org hibernate Transaction API In this particular case we are using JDBC based transactional semantics but it could also run with JTA What does sessionFactory getCurrentSession do First you can call it as many times and anywhere you like once you get hold of your org hibernate SessionFactory The getCurrentSession method always returns the current unit of work Remember that we switched the configuration option for this mechanism to thread in our src main resources hibernate cfg xm1 Due to that setting the context of a current unit of work is bound to the current Java thread that executes the application Wichtig Hibernate offers three methods of current session tracking The thread based method is not intended for production use it is merely useful for prototyping and tutorials such as this one Current session tracking is discussed in more detail later on A org hibernate Session begins when the first call to getcurrentSession is made for the current thread It is then bound by Hibernate to the current thread When the transaction ends either through commit or rollback Hibernate automatically unbinds
346. snnnnnnnnnnnnnennnnnnnnnnnnnnnennnnnnnnnnnnnnnennnnnnnnnannnnnenn 232 16 7 Projektionen Aggregation und Gruppierung 4440snnnnnnnannnnnennnnnnnnnannnnnenn 233 16 8 Abgesetzte Anfragen und Unteranfragen cccceeeceeeeeeeeeeeeeeeeeaeaaeeeeeeeeeees 235 16 9 Anfrage Uber nat rlichen Bezeichner 4 4444440nnnnnnnnnnnnn nn nnnnnnannnnnenn 236 1 7 Native SQL 2 ee aa ental ees 237 17 4 Using a SQLQUerY unse naar 237 17 1 1 SKalare Anfragen ee 237 1721 2 Entity Anfragen sissende anann una an 238 17 1 3 Umgang mit Assoziationen und Collections usennnnsrn seen 239 17 1 4 Wiedergabe mehrerer Entities 444444444nnnnnnnnnnnnnnennnnnnnnnnnnn 239 17 1 5 Wiedergabe nicht gemanagter Entities unnsssnnnnsennennnnnnn nennen 241 17 1 6 Umgang mit Vererbung eee cece cette R 241 14 1 7 Parameter ei a inte Seeded 241 17 2 Benannte SQL Anfragen 24244444snnnnnnnannnnnennnnnnnnnnnnnnnennnnnnnnnnnnnnen mann 242 17 2 1 Die Verwendung der Return Property zur expliziten Spezifizierung von Spalten Allasnamen ante 244 17 2 2 Die Verwendung gespeicherter Prozeduren f r Anfragen 244 17 3 Anwenderspezifische SQL f r create erstellen update aktualisieren und delete l schen le 246 17 4 Angepasste SQL f r das Laden 24444444snnnnnnnannnnnennnnnnnnnnnnnnn nn 247 18 Das Filt
347. stant value in a query You should also consider using named parameters in queries Do not manage your own JDBC connections Hibernate allows the application to manage JDBC connections but his approach should be considered a last resort If you cannot use the built in connection providers consider providing your own implementation of org hibernate connection ConnectionProvider Consider using a custom type Suppose you have a Java type from a library that needs to be persisted but does not provide the accessors needed to map it as a component You should consider implementing org hibernate UserType This approach frees the application code from implementing transformations to from a Hibernate type Use hand coded JDBC in bottlenecks In performance critical areas of the system some kinds of operations might benefit from direct JDBC Do not assume however that JDBC is necessarily faster Please wait until you 315 Kapitel 25 Optimale Verfahren know something is a bottleneck If you need to use direct JDBC you can open a Hibernate Session wrap your JDBC operation as a org hibernate jdbc Work object and using that JDBC connection This way you can still use the same transaction strategy and underlying connection provider Understand session flushing Sometimes the Session synchronizes its persistent state with the database Performance will be affected if this process occurs too often You can sometimes minimize unnecessary f
348. started quicklyhibernate properties is the easiest approach The org hibernate cfg Configuration is intended as a startup time object that will be discarded once a SessionFactory Is created 3 2 Erstellung einer SessionFactory When all mappings have been parsed by the org hibernate cfg Configuration the application must obtain a factory for org hibernate Session instances This factory is intended to be shared by all application threads SessionFactory sessions cfg buildSessionFactory Hibernate does allow your application to instantiate more than one org hibernate SessionFactory This is useful if you are using more than one database 3 3 JDBC Verbindungen It is advisable to have the org hibernate SessionFactory Create and pool JDBC connections for you If you take this approach opening a org hibernate Session is as simple as Session session sessions openSession open a new Session Once you start a task that requires access to the database a JDBC connection will be obtained from the pool Before you can do this you first need to pass some JDBC connection properties to Hibernate All Hibernate property names and semantics are defined on the class org hibernate cfg Environment The most important settings for JDBC connection configuration are outlined below Hibernate will obtain and pool connections using java sql DriverManager if you set the following properties 34 JDBC Verbindungen Tabell
349. stomer Element results get i doc add customer ex commie session close Session session Session dom4jSession Transaction tx Element cust for factory openSession session getSession EntityMode DOM4 J session beginTransaction Element dom4jSession get Customer eines 0 erstes ataa et Element customer Element results get i change the customer name in the XML and database Element name customer element name name element first name setText firstName name element initial setText initial name element last name setText lastName tz comnit y session close customerld lastName When implementing XML based data import export it is useful to combine this feature with Hibernate s replicate Operation 259 260 Verbesserung der Performance 20 1 Abrufstrategien Hibernate uses a fetching strategy to retrieve associated objects if the application needs to navigate the association Fetch strategies can be declared in the O R mapping metadata or over ridden by a particular HQL or criteria query Hibernate3 definiert die folgenden Abrufstrategien Er ECT Join fetching Hibernate retrieves the associated instance or collection in the same sz using an OUTER JOIN Select fetching a second SELECT is used to retrieve the associated entity or collection Unless you explicitly disable lazy fetch
350. subselect SQOL expression 89 Kapitel 5 Grundlagen des O R entity name EntityName node element name gt SEW seen Property a i gt lt joined subclass gt name the fully qualified class name of the subclass table the name of the subclass table proxy optional specifies a class or interface to use for lazy initializing proxies lazy optional defaults to true setting lazy false disables the use of lazy fetching A discriminator column is not required for this mapping strategy Each subclass must however declare a table column holding the object identifier using the lt key gt element The mapping at the start of the chapter would then be re written as lt xml version 1 0 gt lt DOCTYPE hibernate mapping PUBLIC Hibernate Hibernate Mapping DTD EN http hibernate sourceforge net hibernate mapping 3 0 dtd gt lt hibernate mapping package eg gt lt class name Cat table CATS gt lt id name id column uid type long gt lt generator class hilo gt Sid lt property name birthdate type date gt lt property name color not null true gt lt property name sex not null true gt lt property name weight gt lt many to one name mate gt lt set name kittens gt lt key column MOTHER gt lt one to many class Cat gt lt set gt lt joined subclass name DomesticCat table DOMESTIC_CATS gt lt key column CAT gt lt pr
351. t lt DOCTYPE hibernate mapping PUBLIC Hibernate Hibernate Mapping DTD 3 0 EN http hibernate sourceforge net hibernate mapping 3 0 dtd gt lt hibernate mapping package eg gt lt class name Cat table cats discriminator value C gt lt id name id gt lt generator class native gt ES E lt discriminator column subclass type character gt lt property name weight gt lt property name birthdate type date not null true update false gt lt property name color type eg types ColorUserType not null true update false gt lt property name sex not null true update false gt lt property name litterId column litterId update false gt lt many to one name mother column mother_id update false gt 63 Kapitel 5 Grundlagen des O R lt set name kittens inverse true order by litter_id gt lt key column mother_id gt lt one to many class Cat gt lt set gt lt subclass name DomesticCat discriminator value D gt lt property name name type string gt lt subclass gt lt class gt lt class name Dog gt lt mapping for Dog could go here gt lt class gt lt hibernate mapping gt We will now discuss the content of the mapping document We will only describe however the document elements and attributes that are used by Hibernate at runtime The mapping document also
352. t if you have a JMX capable application server e g JBoss AS you can choose to deploy Hibernate as a managed MBean This saves you the one line startup code to build your SessionFactory from a Configuration The container will startup your HibernateService and also take care of service dependencies datasource has to be available before Hibernate starts etc Je nach Ihrer Umgebung m ssen Sie m glicherweise die Konfigurationsoption hibernate connection aggressive_release Auf true setzen falls Ihr Server Connection Containment Ausnahmen d h Verbindungseinschr nkungen anzeigt 3 8 1 Konfiguration der Transaktionsstrategie The Hibernate session API is independent of any transaction demarcation system in your architecture If you let Hibernate use JDBC directly through a connection pool you can begin and end your transactions by calling the JDBC API If you run in a J2EE application server you might want to use bean managed transactions and call the JTA API and UserTransaction when needed Um Ihren Code zwischen diesen beiden und anderen Umgebungen bertragbar zu halten empfehlen wir das optionale Hibernate Transaction APl welches das zu Grunde liegende System wrappt und verbirgt Sie m ssen eine Factory Klasse f r Transaction Instanzen bestimmen indem Sie die Hibernate Konfigurationseigenschaft hibernate transaction factory_class einstellen There are three standard or built in choices org hibernate transaction J
353. t personId eventId System out printin Added person personId to event eventId This is an example of an association between two equally important classes two entities As mentioned earlier there are other classes and types in a typical model usually less important Some you have already seen like an int or a java lang String We call these classes value types and their instances depend on a particular entity Instances of these types do not have 17 Kapitel 1 Tutorial their own identity nor are they shared between entities Two persons do not reference the same firstname object even ifthey have the same first name Value types cannot only be found in the JDK but you can also write dependent classes yourself such as an Address Of MonetaryAmount class In fact in a Hibernate application all JDK classes are considered value types You can also design a collection of value types This is conceptually different from a collection of references to other entities but looks almost the same in Java 1 2 4 Collection von Werten Let s add a collection of email addresses to the Person entity This will be represented as a java util Set of java lang String instances private Set emailAddresses new HashSet public Set getEmailAddresses return emailAddresses public void setEmailAddresses Set emailAddresses this emailAddresses emailAddresses The mapping of this set is as follows lt se
354. t class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt set name people inverse true gt lt key column addressId gt lt one to many class Person gt lt set gt lt class gt create table Person personId bigint not null primary key addressId bigint not null create table Address addressId bigint not null primary key If you use a List or other indexed collection set the key column of the foreign key to not null Hibernate will manage the association from the collections side to maintain the index of each element making the other side virtually inverse by setting update false and insert false lt class name Person gt lt id name id gt lt many to one name address column addressId not null true insert false 130 One to one update false gt lt ielass gt lt class name Address gt lt id name id gt lt list name people gt lt key column addressId not null true gt lt list index column peopleldx gt lt one to many class Person gt lt Mlase gt lt class gt If the underlying foreign key column is NoT NULL it is important that you define not null true on the lt key gt element of the collection mapping Do not only declare not null true ona possible nested lt column gt element but on the lt key gt element 7 4 2 One to one A bidirectional one to one associat
355. t 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 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 insert optional defaults to t rue 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 o Version numbers can be of Hibernate type long integer short timestamp OF calendar Aversion 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 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 5 1 10 Timestamp optional The optional lt timestamp gt element indicates that the table contains timestamped data This provides an alternative to versioning Timestamps are a less safe implementation of optimistic locking However sometimes the application might use the timestamps in other ways lt timestamp column timestamp_c
356. t instances will be destroyed by the garbage collector if the application does not hold a reference anymore Use the Hibernate session to make an object persistent and let Hibernate take care of the SQL statements that need to be executed for this transition Persistent a persistent instance has a representation in the database and an identifier value It might just have been saved or loaded however it is by definition in the scope of a Session Hibernate will detect any changes made to an object in persistent state and synchronize the state with the database when the unit of work completes Developers do not execute manual UPDATE Statements Or DELETE statements when an object should be made transient Detached a detached instance is an object that has been persistent but its session has been closed The reference to the object is still valid of course and the detached instance might even be modified in this state A detached instance can be reattached to a new Session ata later point in time making it and all the modifications persistent again This feature enables a programming model for long running units of work that require user think time We call them application transactions i e a unit of work from the point of view of the user We will now discuss the states and state transitions and the Hibernate methods that trigger a transition in more detail 10 2 Objekte persistent machen Newly instantiated
357. t name emailAddresses table PERSON_EMAIL_ADDR gt lt key column PERSON_ID gt lt element type string column EMAIL_ADDR gt lt set The difference compared with the earlier mapping is the use of the element part which tells Hibernate that the collection does not contain references to another entity but is rather a collection whose elements are values types here specifically of type string The lowercase name tells you itis a Hibernate mapping type converter Again the table attribute of the set element determines the table name for the collection The key element defines the foreign key column name in the collection table The column attribute in the element element defines the column name where the email address values will actually be stored Here is the updated schema EVENTS PERSON_EVENT PERSON_EMAIL_ADDR PERSON EVENT_ID EVENT_ID 18 Bidirektionale Assoziationen EVENT_DATE PERSON_ID gt 25 PERSON TD I lt 72 BER PERSONEED TITLE AGE EMAIL_ADDR FIRSTNAME LASTNAME You can see that the primary key of the collection table is in fact a composite key that uses both columns This also implies that there cannot be duplicate email addresses per person which is exactly the semantics we need for a set in Java You can now try to add elements to this collection just like we did before by linking persons
358. t name history inverse true order by effectiveEndDate desc gt lt key column currentContractId gt lt one to many entity name HistoricalContract gt lt set gt lt class gt lt class name Contract table ContractHistory entity name HistoricalContract gt lt many to one name currentContract column currentContractId entity name CurrentContract gt lt class gt Associations are now specified using entity name instead of class 5 4 SQL angefuhrte Bezeichner 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 Dialect This is usually double quotes but the SQL Server uses brackets and MySQL uses backticks lt class name LineItem table Line Item gt lt id name id column Item Id gt lt generator class assigned gt lt id gt lt property name itemNumber column Item gt lt class gt 5 5 Metadata Alternativen XML does not suit all users so there are some alternative ways to define O R mapping metadata in Hibernate 5 5 1 Die Verwendung von XDoclet Markup Many Hibernate users prefer to embed mapping information directly in sourcecode using XDoclet hibernate tags We do not cover this approach in this reference guide since it is considered part of XDoclet However we include the following example of the cat cl
359. t name purchasedItems table purchase_items lazy true gt lt key column order_id gt lt composite element class eg Purchase gt lt property name purchaseDate gt lt property name price gt lt property name quantity gt lt many to one name item class eg Item gt lt class attribute is optional gt lt composite element gt lt set gt olass gt There cannot be a reference to the purchase on the other side for bidirectional association navigation Components are value types and do not allow shared references A single Purchase can be in the set of an Order but it cannot be referenced by the Item atthe same time Sogar dreifache oder vierfache usw Assoziationen sind m glich lt class name leg Orden re lt set name purchasedItems table purchase_items lazy true gt lt key column order_id gt lt composite element class eg OrderLine gt lt many to one name purchaseDetails class eg Purchase gt lt many to one name item class eg Item gt lt composite element gt lt set gt lt class gt Composite elements can appear in queries using the same syntax as associations to other entities 8 3 Komponenten als Map Indizes The lt composite map key gt element allows you to map a component class as the key of a Map Ensure that you override hashCode and equals correctly on the component class 8 4 Komponenten als zusammengesetzte Bezeichner You can use a c
360. t of work The latter is also more maintainable and extensible The most common pattern in a multi user client server application is session per request In this model a request from the client is sent to the server where the Hibernate persistence layer runs A new Hibernate session is opened and all database operations are executed in this unit of work On completion of the work and once the response for the client has been prepared the session is flushed and closed Use a single database transaction to serve the clients request starting and committing it when you open and close the Session The relationship between the two is one to one and this model is a perfect fit for many applications The challenge lies in the implementation Hibernate provides built in management of the current session to simplify this pattern Start a transaction when a server request has to be processed and end the transaction before the response is sent to the client Common solutions are ServletFilter AOP interceptor with a pointcut on the service methods or a proxy interception container An EJB container is a standardized way to implement cross cutting aspects such as transaction demarcation on EJB session beans declaratively with CMT If you use programmatic transaction demarcation for ease of use and code portability use the Hibernate Transaction API shown later in this chapter Your application code can access a current session to process the request by
361. t p Parent session load Parent class pid Child c Child p getChildren iterator next p getChildren remove c c setParent null session flush will not remove c from the database In this case it will only remove the link to p and cause a NoT NULL Constraint violation You need to explicitly delete the child Parent p Parent session load Parent class pid Child c Child p getChildren iterator next p getChildren remove c session delete c session flush In our case a Child cannot exist without its parent So if we remove a Child from the collection we do want it to be deleted To do this we must use cascade all delete orphan lt set name children inverse true cascade all delete orphan gt lt key column parent_id gt lt one to many class Child gt lt set gt Even though the collection mapping specifies inverse true cascades are still processed by iterating the collection elements If you need an object be saved deleted or updated by cascade you must add it to the collection It is not enough to simply call setParent 22 4 Cascades and unsaved value Suppose we loaded up a Parent in one Session made some changes in a Ul action and wanted to persist these changes in a new session by calling update The Parent will contain a collection of children and since the cascading update is enabled Hibernate needs to know which children are
362. table gt hi_value lt param gt lt param name column gt next_value lt param gt lt param name max_lo gt 100 lt param gt lt generator gt lt fid gt lt id name id type long column cat_id gt lt generator class seghilo gt lt param name sequence gt hi_value lt param gt lt param name max_lo gt 100 lt param gt lt generator gt o gt Unfortunately you cannot use 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 5 1 4 3 UUID Algorithmus 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 5 1 4 4 Identit tsspalten und Sequenzen For databases that support identity columns DB2 MySQL Sybase MS SQL you can use 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 lt id name id type long column person_id gt lt generator class sequence gt lt param name sequence 72 Enhanced identifier generators
363. te No exception thrown by Hibernate can be treated as recoverable Ensure that the session will be closed by calling close ina finally block The HibernateException which wraps most of the errors that can occur in a Hibernate persistence layer is an unchecked exception It was not in older versions of Hibernate In our 188 Transaktions Timeout opinion we should not force the application developer to catch an unrecoverable exception at a low layer In most systems unchecked and fatal exceptions are handled in one of the first frames of the method call stack i e in higher layers and either an error message is presented to the application user or some other appropriate action is taken Note that Hibernate might also throw other unchecked exceptions that are not a HibernateException These are not recoverable and appropriate action should be taken Hibernate wraps SQLExceptions thrown while interacting with the database in a JDBCException In fact Hibernate will attempt to convert the exception into a more meaningful subclass of JDBCException The underlying SQLException is always available via JDBCException getCause Hibernate converts the SQLException into an appropriate JDBCException subclass using the SQLExceptionConverter attached to the SessionFactory By default the soLExceptionConverter is defined by the configured dialect However it is also possible to plug in a custom implementation See the javadocs fo
364. te Anfrage bei Ihrem Servlet eingeht das statische Initialisierungsprogramm in HibernateUtil wird aufgerufen und pr fen Sie die detaillierte Ausgabe nach Ausnahmen 1 4 Zusammenfassung This tutorial covered the basics of writing a simple standalone Hibernate application and a small web application More tutorials are available from the Hibernate website http hibernate org 25 26 Architektur 2 1 bersicht The diagram below provides a high level view of the Hibernate architecture Application Persistent Objects HIBERNATE hibernate A properties AMIL MEDINE Database We do not have the scope in this document to provide a more detailed view of all the runtime architectures available Hibernate is flexible and supports several different approaches We will however show the two extremes minimal architecture and comprehensive architecture This next diagram illustrates how Hibernate utilizes database and configuration data to provide persistence services and persistent objects to the application The minimal architecture has the application provide its own JDBC connections and manage its own transactions This approach uses a minimal subset of Hibernate s APIs 27 Kapitel 2 Architektur The comprehensive architecture abstracts the application away from the underlying JDBC JTA APIs and allows Hibernate to manage the details Here are some definitions of the
365. te c3p0 timeout 1800 hibernate c3p0 max_statements 50 hibernate dialect org hibernate dialect PostgreSQLDialect For use inside an application server you should almost always configure Hibernate to obtain connections from an application server javax sql Datasource registered in JNDI You will need to set at least one of the following properties Tabelle 3 2 Properties der Hibernate Datenquelle Datasource Property Name Zweck hibernate connection datasource datasource JNDI name hibernate jndi ur URL des JNDI Providers optional hibernate jndi class Klasse der JNDI InitialContextFactory optional hibernate connection username Datenbankbenuizer optional hibernate connection password Passwort des Datenbankbenuizers optional 35 Kapitel 3 Konfiguration Here is an example hibernate properties file for an application server provided JNDI datasource hibernate connection datasource java comp env jdbc test hibernate transaction factory_class org hibernate transaction JTATransactionFactory hibernate transaction manager_lookup_class org hibernate transaction JBossTransactionManagerLookup hibernate dialect org hibernate dialect PostgreSQLDialect Von einer JNDI Datenquelle erhaltene JDBC Verbindungen nehmen automatisch an den vom Container verwalteten Transaktionen des Applikationsservers teil Arbitrary connection properties can be given by prepending hibernate connection to the connection propert
366. te connection release_mode Zweck Specifies when Hibernate should release JDBC connections By default a JDBC connection is held until the session is explicitly closed or disconnected For an application server JTA datasource use after_statement to aggressively release connections after every JDBC call For a non JTA connection it often makes sense to release the connection at the end of each transaction by using after_transaction auto will choose after statement for the JTA and CMT transaction strategies and after _transaction for the JDBC transaction strategy e g auto default on_close after_transaction after_statement This setting only affects Sessions returned from SessionFactory openSession For Sessions obtained through SessionFactory getCurrentSession the CurrentSessionContext implementation configured for use controls the connection release mode for those Sessions See Abschnitt 2 5 Contextual sessions hibernate connection lt propertyName gt Pass the JDBC property lt propertyName gt to DriverManager getConnection hibernate jndi lt propertyName gt Pass the property lt propertyName gt to the JNDI InitialContextFactory Tabelle 3 5 Hibernate Cache Properties Property Name Zweck hibernate cache provider_class hibernate cache use_minimal_puts Der Klassenname eines anwenderdefinierten CacheProvider e g classname of CacheProvider Optimizes secon
367. te of the property element tells Hibernate which getter and setter methods to use In this case Hibernate will search for getDate setDate getTitle and setTitle methods Die Konfiguration von Hibernate The title mapping also lacks a type attribute The types declared and used in the mapping files are not Java data types they are not SQL database types either These types are called Hibernate mapping types converters which can translate from Java to SQL data types and vice versa Again Hibernate will try to determine the correct conversion and mapping type itself if the type attribute is not present in the mapping In some cases this automatic detection using Reflection on the Java class might not have the default you expect or need This is the case with the date property Hibernate cannot know if the property which is of java util Date should map to a SQL date timestamp Or time column Full date and time information is preserved by mapping the property with a timestamp converter Tipp Hibernate makes this mapping type determination using reflection when the mapping files are processed This can take time and resources so if startup performance is important you should consider explicitly defining the type to use Save this mapping file as src main resources org hibernate tutorial domain Event hbm xml 1 1 4 Die Konfiguration von Hibernate At this point you should have the persistent class and it
368. tel 15 HQL Die Hiberna from Formula Parameter from Formula as form Parameter as param It is good practice to name query aliases using an initial lowercase as this is consistent with Java naming standards for local variables e g domesticCat 15 3 Assoziationen und Verbunde Joins You can also assign aliases to associated entities or to elements of a collection of values using a join For example from Cat as eat inner join cat mate as mate left outer join cat kittens as kitten from Cat as cat left join cat mate kittens as kittens from Formula form full join form parameter param The supported join types are borrowed from ANSI SQL e inner join e left outer join e right outer join full join in der Regel nicht sehr n tzlich Die inner join left outer joinund right outer join Konstrukte k nnen abgek rzt werden from Cat as cat join cat mate as mate left join cat kittens as kitten Sie k nnen weitere Verbundbedingungen unter Verwendung des HQL Schl sselbegriffs with eingeben from Cat as cat left join cat kittens as kitten with kitten bodyWeight 210 Formen der Verbundsyntax 1 A fetch join allows associations or collections of values to be initialized along with their parent objects using a single select This is particularly useful in the case of a collection It effectively overrides the outer join and lazy declarations of the mapping file for associations and collections
369. that class while composition or aggregation usually translates to a value type We will revisit both concepts throughout this reference guide 96 Grundlegende Wertetypen 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 lt class gt lt subclass gt and so on are used For value types we use lt property gt lt component gt 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 With the exception of collections all built in Hibernate types support null semantics 5 2 2 Grundlegende Wertetypen The built in basic mapping types can be roughly categorized into the following integer long short float double character byte boolean yes_no true_false Typen Mappings von Java Primitives oder Wrapper Klassen zu passenden Anbieter spezifischen SQL Spaltentypen boolean yes_no Und true_false sind alternative Verschl sselungen f r einen Java boolean oder java lang Boolean string Ein Type Mapping von java lang String ZU VARCHAR oder Oracle VARCHAR2 date time timestamp Type Mappings von java util Date und dessen Subklassen z
370. the name of a class that implements org hibernate cache CacheProvider using the property hibernate cache provider_class Hibernate is bundled with a number of built in integrations with the open source cache providers that are listed below You can also implement your own and plug it in as outlined above Note that versions prior to 3 2 use EnCache as the default cache provider Tabelle 20 1 Cache Provider Cache Provider Klasse Typ Cluster Anfragen sicher Cache unterst tzt Hash org hibernate cache HashtableCacheSpeieherr yes Tabelle nicht 270 Cache Mappings Cache Provider Klasse Typ Cluster Anfragen sicher Cache unterst tzt f r den Produktionsgebrauch vorgesehen EHCache org hibernate cache EhCacheProvide peicher yes Disk OSCache org hibernate cache OSCacheProvide peicher yes Disk SwarmCacheorg hibernate cache SwarmCacheProvg elustertt ja ip geclusterte multicast Au erkraftsetzung JBoss org hibernate cache TreeCacheProvigeelustert ja ja clock Cache 1 x ip Replikation sync req multicast transaktional JBoss org hibernate cache jbc JBossCachegedluster ct o es ja clock Cache 2 ip replication sync req multicast or transaktional invalidation 20 2 1 Cache Mappings Das lt cache gt Element des Mappings einer Klasse oder Collection besitzt folgende Form lt cache usage transactional read write nonstrict read write read only region R
371. the discussion of generated properties for more information Note lt Timestamp gt S equivalent to lt version type timestamp gt And lt timestamp source db gt is equivalent to lt version type dbtimestamp gt 5 1 11 Property The lt property gt element declares a persistent JavaBean style property of the class lt property name propertyName column column_name type typename 90009 update true false 79 Kapitel 5 Grundlagen des O R insert true false formula arbitrary SQL expression access field property ClassName lazy true false unique true false not null true false optimistic lock true false 90000009 generated never insert always node element name attribute name element attribute index index_name unique_key unique_key_id Tengri un precision P scale 5 gt name Der Name der Property mit klein geschriebenem Anfangsbuchstaben column optional defaults to the property name the name of the mapped database table column This can also be specified by nested lt column gt element s type optional Ein Name der den Hibernate Typ anzeigt update insert optional defaults to true specifies that the mapped columns should be included in SQL uppaTE 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
372. the org hibernate Session from the thread and closes it for you If you call getcurrentSession again you get a new org hibernate Session and can start a new unit of work Related to the unit of work scope should the Hibernate org hibernate Session be used to execute one or several database operations The above example uses one org hibernate Session for one operation However this is pure coincidence the example is just not complex enough to show any other approach The scope of a Hibernate org hibernate Session is flexible but you should never design your application to use a new Hibernate org hibernate Session for every database operation Even though it is used in the following examples consider session per operation an anti pattern A real web application is shown later in the tutorial which will help illustrate this See Kapitel 12 Transactions and Concurrency for more information about transaction handling and demarcation The previous example also skipped any error handling and rollback To run this we will make use of the Maven exec plugin to call our class with the necessary classpath setup mvn exec java Dexec mainClass org hibernate tutorial EventManager Dexec args store 12 Das Laden und Speichern von Objekten Anmerkung You may need to perform mvn compile first You should see Hibernate starting up and depending on your configuration lots of log output Towards the end the following line will b
373. the same collection instance Due to 107 Kapitel 6 Collection mapping the underlying relational model collection valued properties do not support null value semantics Hibernate does not distinguish between a null collection reference and an empty collection Use persistent collections the same way you use ordinary Java collections However please ensure you understand the semantics of bidirectional associations these are discussed later 6 2 Collection Mappings Tipp There are quite a range of mappings that can be generated for collections that cover many common relational models We suggest you experiment with the schema generation tool so that you understand how various mapping declarations translate to database tables The Hibernate mapping element used for mapping a collection depends upon the type of interface For example a lt set gt element is used for mapping properties of type set lt class name Product gt lt id name serialNumber column productSerialNumber gt lt set name parts gt lt key column productSerialNumber not null true gt lt one to many class Part gt lt set gt lt class gt Neben lt set gt gibt es auch lt list gt lt map gt lt bag gt lt array gt und lt primitive array gt Mapping Elemente Das lt map gt Element ist charakteristisch lt map name propertyName table table_name schema schema_name lazy true extra false inverse true fals
374. ther class you can obtain the SessionFactory using a JNDI lookup It is recommended that you bind the sessionFactory to JNDI in a managed environment and use a static singleton otherwise To shield your application code from these details we also recommend to hide the actual lookup code for a SessionFactory in a helper class such as HibernateUtil getSessionFactory Note that such a class is also a convenient way to startup Hibernate see chapter 1 3 8 3 Aktuelles Management des Sessionkontexts mit JTA The easiest way to handle sessions and transactions is Hibernate s automatic current Session management For a discussion of contextual sessions see Abschnitt 2 5 Contextual sessions Using the jta session context if there is no Hibernate session associated with the current JTA transaction one will be started and associated with that JTA transaction the first time you call sessionFactory getCurrentSession The sessions retrieved via getCurrentSession in the jta context are set to automatically flush before the transaction completes close after the transaction completes and aggressively release JDBC connections after each statement This allows the sessions to be managed by the life cycle of the JTA transaction to which it is associated keeping user code clean of such management concerns Your code can either use JTA programmatically through UserTransaction or recommended for portable code use the Hibernate Transaction API
375. tion cfg new Configuration addResource Item hbm xml addResource Bid hbm xml An alternative way is to specify the mapped class and allow Hibernate to find the mapping document for you Configuration cfg new Configuration addClass org hibernate auction Item class addClass org hibernate auction Bid class Hibernate will then search for mapping files named org hibernate auction Item hbm xml and org hibernate auction Bid hbm xml in the classpath This approach eliminates any hardcoded filenames A org hibernate cfg Configuration also allows you to specify configuration properties For example Configuration cfg new Configuration addClass org hibernate auction Item class addClass org hibernate auction Bid class setProperty hibernate dialect org hibernate dialect MySQLInnoDBDialect setProperty hibernate connection datasource java comp env jdbc test setProperty hibernate order_updates true 33 Kapitel 3 Konfiguration This is not the only way to pass configuration properties to Hibernate Some alternative options include 1 Pass an instance of java util Properties tO Configuration setProperties 2 Place a file named hibernate properties in a root directory of the classpath 3 Stellen Sie die system Properties mittels java Dproperty value ein 4 Include lt property gt elements in hibernate cfg xml this is discussed later If you want to get
376. tional defaults to false by default natural identifier properties are assumed to be immutable constant 5 1 15 Component and dynamic component The lt component gt element maps properties of a child object to columns of the table of a parent class Components can in turn declare their own properties components or collections See the Component examples below lt component name propertyName class className insert true false update true false access field property ClassName lazy true false optimistic lock true false 000009000909 unique true false node element name 86 Properties lt PEOPET EY 0 i many to one u do lt component gt name the name of the property class optional defaults to the property type determined by reflection the name of the component child class insert do the mapped columns appear in SQL INSERTs update do the mapped columns appear in SQL UPDATEs access optional defaults to property the strategy Hibernate uses for accessing the property value 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 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
377. tive development 19 1 Das Arbeiten mit XML Daten Hibernate allows you to work with persistent XML data in much the same way you work with persistent POJOs A parsed XML tree can be thought of as another way of representing the relational data at the object level instead of POJOs Hibernate unterst tzt dom4j als API zur Verarbeitung von XML Baumen Sie k nnen Anfragen die dom4j Baume von der Datenbank abrufen schreiben wobei alle Modifikationen am Baum automatisch mit der Datenbank synchronisiert werden Sie k nnen sogar ein XML Dokument unter Verwendung von dom4j auf die Syntax pr fen und mittels Hibernates Grundvorg ngen persist saveOrUpdate merge delete replicate Merging wird noch nicht unterst tzt in die Datenbank schreiben Dieses Feature bietet zahlreiche Anwendungen einschlie lich des Imports Exports von Daten Externalisierung von Entity Daten via JMS oder SOAP und XSLT basiertem Reporting A single mapping can be used to simultaneously map properties of a class and nodes of an XML document to the database or ifthere is no class to map it can be used to map just the XML 19 1 1 Spezifizierung des gemeinsamen Mappens von XML und Klasse Hier ist ein Beispiel f r das gleichzeitige Mappen eines POJO und XML lt class name Account table ACCOUNTS node account gt lt id name accountId column ACCOUNT_ID node id gt lt many to one name customer column CUSTOMER_ID node
378. tively you can assign the identifier using an overloaded version of save DomesticCat pk new DomesticCat pk setColor Color TABBY pk setSex F pk setName PK pk setKittens new HashSet pk addKitten fritz sess save pk new Long 1234 If the object you make persistent has associated objects e g the kittens collection in the previous example these objects can be made persistent in any order you like unless you have a NOT NULL Constraint upon a foreign key column There is never a risk of violating foreign key constraints However you might violate a not NULL Constraint if you save the objects in the wrong order Usually you do not bother with this detail as you will normally use Hibernate s transitive persistence feature to save the associated objects automatically Then even NoT NULL constraint violations do not occur Hibernate will take care of everything Transitive persistence is discussed later in this chapter 10 3 Das Laden eines Objekts The 1oad methods of Session provide a way of retrieving a persistent instance if you know its identifier 1oad takes a class object and loads the state into a newly instantiated instance of that class in a persistent state 154 Das Laden eines Objekts Cat fritz Cat sess load Cat class generatedlId you need to wrap primitive identifiers long id 1234 DomesticCat pk DomesticCat sess load DomesticCat class new Long id
379. tribut der lt class gt und lt subclass gt Elemente spezifiziert The force attribute is only useful if the table contains rows with extra discriminator values that are not mapped to a persistent class This will not usually be the case The formula attribute allows you to declare an arbitrary SQL expression that will be used to evaluate the type of a row For example lt discriminator formula case when CLASS_TYPE in a b c then 0 else 1 end type integer gt 5 1 9 Version optional The lt version gt element is optional and indicates that the table contains versioned data This is particularly useful if you plan to use ong transactions See below for more information 77 Kapitel 5 Grundlagen des O R lt version 8 8998 O column version_column name propertyName type typename access field property ClassName unsaved value nulllnegative undefined generated never always 2009999 insert true false node element name attribute name element attribute column optional defaults to the property name the name of the column holding the version number name the name of a property of the persistent class type optional defaults to integer the type of the version number access optional defaults to property the strategy Hibernate uses to access the property value unsaved value optional defaults to undefined a version property value tha
380. tuationen zum Einsatz die Anwendung l dt ein Objekt in der ersten Session das Objekt wird an den UI Tier weitergegeben am Objekt werden einige Modifikationen vorgenommen das Objekt wird zur ck an den Business Logic Tier geleitet die Anwendung persistiert diese Modifikationen durch Aufruf von update in einer zweiten Session saveOrUpdate tut folgendes falls das Objekt in dieser Session bereits persistent ist geschieht nichts falls ein anderes mit der Session assoziiertes Objekt denselben Bezeichner besitzt wird eine Ausnahme gemeldet falls das Objekt keine Bezeichner Property besitzt speichern Sie es mittels save e falls der Bezeichner des Objekts einen ihm zugeordneten Wert am neu instantiierten Objekt besitzt speichern Sie mittels save if the object is versioned by a lt version gt Or lt timestamp gt and the version property value is the same value assigned to a newly instantiated object save it andernfalls aktualisieren Sie das Objekt mittels update und merge ist v llig anders falls eine persistente Instanz mit demselben Bezeichner zum gegenw rtigen Zeitpunkt mit der Session assoziiert ist so kopieren Sie den Status des vorgegebenen Objekts in die persistente Instanz falls keine persistente Instanz zum gegenw rtigen Zeitpunkt mit der Session assoziiert wird so versuchen Sie sie aus der Datenbank zu laden oder erstellen Sie eine neue persistente Instanz die persistente Instanz
381. two concurrently running threads An exception thrown by Hibernate means you have to rollback your database transaction and close the Session immediately this is discussed in more detail later in the chapter If your 184 Abgrenzung von Datenbanktransaktionen Session Is bound to the application you have to stop the application Rolling back the database transaction does not put your business objects back into the state they were at the start of the transaction This means that the database state and the business objects will be out of sync Usually this is not a problem because exceptions are not recoverable and you will have to start over after rollback anyway The session caches every object that is in a persistent state watched and checked for dirty state by Hibernate If you keep it open for a long time or simply load too much data it will grow endlessly until you get an OutOfMemoryException One solution is to call clear and evict to manage the Session cache but you should consider a Stored Procedure if you need mass data operations Some solutions are shown in Kapitel 14 Batch Verarbeitung Keeping a Session open for the duration of a user session also means a higher probability of stale data 12 2 Abgrenzung von Datenbanktransaktionen Database or system transaction boundaries are always necessary No communication with the database can occur outside of a database transaction this seems to confuse many developers w
382. type Next while still in hibernate cfg xml1 bind the permissions to roles 200 Deklarative Sicherheit in Hibernate lt grant role admin entity name User actions insert update read gt lt grant role su entity name User actions gt Die Rollennamen sind die von Ihrem JACC Anbieter verstandenen Rollen 201 202 Batch Verarbeitung A naive approach to inserting 100 000 rows in the database using Hibernate might look like this Session session sessionFactory openSession Transaction tx session beginTransaction for int i 0 12100000 if Customer customer new Customer NP session save customer x commit session close This would fall over with an outofMemoryException somewhere around the 50 000th row That is because Hibernate caches all the newly inserted customer instances in the session level cache In this chapter we will show you how to avoid this problem If you are undertaking batch processing you will need to enable the use of JDBC batching This is absolutely essential if you want to achieve optimal performance Set the JDBC batch size to a reasonable number 10 50 for example hibernate jdbc batch_size 20 Hibernate disables insert batching at the JDBC level transparently if you use an identity identifier generator You can also do this kind of work in a process where interaction with the second level cache is completely disabled hibernate
383. u SQL Typen DATE TIME und TIMESTAMP oder quivalent calendar calendar_date Type Mappings von java util Calendar zu SQL Typen TIMESTAMP und DATE oder quivalent big_decimal big_integer Type Mappings von java math BigDecimal Und java math BigInteger ZU NUMERIC oder Oracle NUMBER locale timezone currency Type Mappings von java util Locale java util TimeZone Und java util Currency ZUVARCHAR oder Oracle VARCHAR2 Instanzen von Locale und Currency werden zu ihren ISO Codes gemappt Instanzen von TimeZone werden zu ihrer 1p gemappt class Ein Type Mapping von java lang Class ZU VARCHAR oder Oracle VARCHAR2 Eine Class wird zu ihrem vollst ndigen Namen gemappt binary Mappt Byte Arrays zum zugeh rigen SQL Bin rtyp text Mappt lange Java Strings zum SQL cLoB oder TEXT Typ 97 Kapitel 5 Grundlagen des O R serializable Maps serializable Java types to an appropriate SQL binary type You can also indicate the Hibernate type serializable with the name of a serializable Java class or interface that does not default to a basic type clob blob Type mappings for the JDBC classes 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 imm_date imm_time imm_timestamp imm_calendar imm_calendar_date imm_serializable imm_b
384. uery from Employee as e where e salary gt targetSalary setLong targetSalary new Long 1000000 ESEO 252 Hibernate Filter Even though a salary constraint was mentioned explicitly on the results in the above HQL because of the enabled filter the query will return only currently active employees who have a salary greater than one million dollars If you want to use filters with outer joining either through HQL or load fetching be careful of the direction of the condition expression It is safest to set this up for left outer joining Place the parameter first followed by the column name s after the operator After being defined a filter might be attached to multiple entities and or collections each with its own condition This can be problematic when the conditions are the same each time Using lt filter def gt allows you to definine a default condition either as an attribute or CDATA lt filter def name myFilter condition abc gt xyz gt lt filter def gt lt filter def name myOtherFilter gt abe xyz lt filter def gt This default condition will be used whenever the filter is attached to something without specifying a condition This means you can give a specific condition as part of the attachment of the filter that overrides the default condition in that particular case 253 254 XML Mapping XML Mapping is an experimental feature in Hibernate 3 0 and is currently under ac
385. umn CATEGORY_ID gt lt bag name items table CATEGORY_ITEM gt lt key column CATEGORY_ID gt lt many to many class Item column ITEM_ID gt lt bag gt lt class gt lt class name Item gt lt id name id column ITEM_ID gt 116 Bidirektionale Assoziationen lt inverse end gt lt bag name categories table CATEGORY_ITEM inverse true gt lt key column ITEM_ID gt lt many to many class Category column CATEGORY_ID gt lt bag gt lt class gt Changes made only to the inverse end of the association are not persisted This means that Hibernate has two representations in memory for every bidirectional association one link from A to B and another link from B to A This is easier to understand if you think about the Java object model and how a many to many relationship in Javais created category getItems add item The category now knows about the relationship item getCategories add category The item now knows about the relationship session persist item The relationship won t be saved session persist category The relationship will be saved Die nicht invertierte Seite wird dazu benutzt die gespeicherte Darstellung in der Datenbank zu speichern You can define a bidirectional one to many association by mapping a one to many association to the same table column s as a many to one association and declaring the many valued end inverse true
386. unt payments as payment where currentUser user and PaymentStatus UNPAID isNull payment currentStatus name PaymentStatus UNPAID order by account type sortOrder account accountNumber payment dueDate 15 15 Bulk Aktualisierung und L schen HQL now supports update delete and insert select Statements See Abschnitt 14 4 Vorg nge im DML Stil for more information 15 16 Tipps amp Tricks You can count the number of query results without returning them Integer session createQuery select count from iterate next intValue Um ein Ergebnis nach der Gr e einer Collection zu ordnen verwenden Sie die folgende Anfrage select usr id usr name from User as usr left join usr messages as msg group by usr id usr name order by count msg 225 Kapitel 15 HQL Die Hiberna Falls Ihre Datenbank Unterauswahlen unterst tzt k nnen Sie eine Bedingung bez glich der Auswahlgr e in der where Klausel Ihrer Anfrage stellen from User usr where size usr messages gt 1 If your database does not support subselects use the following query select usr id usr name from User usr join usr messages msg group by usr id usr name having count msg gt 1 As this solution cannot return a User with zero messages because of the inner join the following form is also useful select usr id usr name from User as usr left join usr messages as msg group by usr id usr na
387. various LockModes See the API documentation and the chapter on transaction handling for more information Reattachment is not the only usecase for lock Other models for long units of work are discussed in Abschnitt 12 3 Optimistische Nebenl ufigkeitskontrolle 10 7 Automatische Statuserkennung Benutzer von Hibernate haben den Wunsch nach einer allgemeinen Methode ge u ert die entweder eine transiente Instanz durch Generierung eines neuen Bezeichners speichert oder die dem aktuellen Bezeichner zugeh rigen abgesetzten Instanzen aktualisiert erneut hinzuf gt Die saveOrUpdate Methode implementiert diese Funktionalit t in the first session Cat cat Cat firstSession load Cat class catID in a higher tier of the application Cat mate new Cat cat setMate mate later in a new session secondSession saveOrUpdate cat update existing state cat has a non null id secondSession saveOrUpdate mate save the new instance mate has a null id 163 Kapitel 10 Das Arbeiten mit Gebrauch und Semantik von saveOrUpdate scheinen neue Benutzer manchmal zu berfordern So lange Sie nicht versuchen diese Instanzen von einer Session in einer neuen Session zu verwenden sollten Sie update saveOrUpdate Oder merge ohnehin nicht benutzen m ssen Manchmal kommen ganze Anwendungen ohne irgendeine dieser Methoden aus In der Regel kommen update oder saveOrUpdate in folgenden Si
388. ve this 20 Teil 3 Die EventManager Webanwendung The get and set methods for the collection are now protected This allows classes in the same package and subclasses to still access the methods but prevents everybody else from altering the collections directly Repeat the steps for the collection on the other side What about the inverse mapping attribute For you and for Java a bi directional link is simply a matter of setting the references on both sides correctly Hibernate however does not have enough information to correctly arrange SQL INSERT and UPDATE statements to avoid constraint violations Making one side of the association inverse tells Hibernate to consider it a mirror of the other side That is all that is necessary for Hibernate to resolve any issues that arise when transforming a directional navigation model to a SQL database schema The rules are straightforward all bi directional associations need one side as inverse In a one to many association it has to be the many side and in many to many association you can select either side 1 3 Teil 3 Die EventManager Webanwendung A Hibernate web application uses Session and Transaction almost like a standalone application However some common patterns are useful You can now write an EventManagerServlet This servlet can list all events stored in the database and it provides an HTML form to enter new events 1 3 1 Das Schreiben des Grundservlets F
389. ved value cecececeee ce eeeteeeeeeeeeeeeaeeaeeeeeeeeeeeeaaaaeeeeeeeeeeeeaaa 292 22 5 Zusammenfassung 0 ceceee cece ceeeeeee cece tees ae eaeeeeeeee sees aeaaeaeeeeeeeeeeaeaaaaeeeeeeeeeeaeaae 293 23 Beispiel Web Log Anwendung ccceeceeeeeeeeeeeeeee eee eeeeeeaeeeeeeeaeeeeeaaaeeeeeaaaes 295 23 1 Persistente Klassen rennen a lach 295 23 2 Hibernate Mappings 24444HH4n4sennnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn 296 23 3 Hibernate Code un ea Heilige 298 24 Beispiel Verschiedene Mappings 4444444HHHBnR nennen nn en nnnnnn en nnnnnn nn 303 24 1 Arbeitgeber Arbeitnehmer uunnsssnnnnnnnnnnnnnnnnnnnnnnnnnnnnn anne nnnnnnnnn 303 24 2 AUTOWEEK ionieni iian nenn ensure nennen ieee 305 HIBERNATE Relational Persis 24 3 Kunde Bestellung Produkt cccceceeeeeeeeeeeeeeeeeeaaeeeeeeeeeeeeeeaaaaeeeeeeeeeeeeaeaaaaees 307 24 4 Verschiedene Beispiele von Mappings cecceeeeeeeeaeeeeeeeaaeeeeeeaaeeeeeeaaeeeees 309 24 4 1 Typisierte One to One Assoziation uussnsnsssnnnnenennnnnnnnnnnnen nn 309 24 4 2 Beispiel f r einen zusammengesetzten Schl ssel u 309 24 4 3 Many to Many mit geteiltem Attribut des zusammengesetzten SCHIUSSEIS zum passen E ae De oes pea make 312 24 4 4 Inhaltsbasierte Diskriminierung unnnssenennnennnnnnnnnnnnnnnnnnnnnnnenn 312 24 4 5 Assoziati
390. von cat getDog 238 Umgang mit Assoziationen und Collections 17 1 3 Umgang mit Assoziationen und Collections Es ist m glich eager Join in Dog anzuwenden um den Extra Weg zur Datenbank zur Initialisierung des Proxy zu vermeiden Dies geschieht mittels der addJoin Methode die es Ihnen erm glicht eine Assoziation oder Collection zu verbinden sess createSQLQuery SELECT c ID NAME BIRTHDATE DOG_ID D_ID D_NAME FROM CATS c DOGS d WHERE c DOG_ID d D_ID addEntity cat Cat class saddJoini cat dog i In this example the returned cat s will have their aog property fully initialized without any extra roundtrip to the database Notice that you added an alias name cat to be able to specify the target property path of the join It is possible to do the same eager joining for collections e g if the cat had a one to many to Dog instead sess createSQLQuery SELECT ID NAME BIRTHDATE D_ID D_NAME CAT_ID FROM CATS c DOGS d WHERE CID A CAT TDT addEntity cat Cat class addJoin cat dogs At this stage you are reaching the limits of what is possible with native queries without starting to enhance the sql queries to make them usable in Hibernate Problems can arise when returning multiple entities of the same type or when the default alias column names are not enough 17 1 4 Wiedergabe mehrerer Entities Until now the result set column names are assumed to be the same as the column names speci
391. we return null if Proxy isProxyClass object getClass InvocationHandler handler Proxy getInvocationHandler object if DataProxyHandler class isAssignableFrom handler getClass DataProxyHandler myHandler DataProxyHandler handler return myHandler getEntityName return null various other utility methods 61 Kapitel 4 Persistente Klassen rr The EntityNameResolver implementation IMPL NOTE An EntityNameResolver really defines a strategy for how entity names should be resolved Since this particular impl can handle resolution for all of our entities we want to take advantage of the fact that SessionFactoryImpl keeps these in a Set so that we only ever have one instance registered Why Well when it comes time to resolve an entity name Hibernate must iterate over all the registered resolvers So keeping that number down helps that process be as speedy as possible Hence the equals and hashCode impls 2 public class MyEntityNameResolver implements EntityNameResolver public static final MyEntityNameResolver INSTANCE new MyEntityNameResolver public String resolveEntityName Object entity return ProxyHelper extractEntityName entity public boolean equals Object obj return getClass equals obj getClass public int hashCode return getClass hashCode public class MyEntityTuplizer extends PojoEntityTuplizer public MyEntityTuplizer EntityMetam
392. when this property is dirty unique optional defaults to false specifies that a unique constraint exists upon all mapped columns of the component O 8998 O09 Die untergeordneten lt property gt Tags mappen Properties der untergeordneten Klasse zu den Spalten der Tabelle Das lt component gt Element erm glicht ein lt parent gt Subelement das eine Property der Komponentenklasse als R ckreferenz zur enthaltenden Entity mappt The lt dynamic component gt element allows a Map to be mapped as a component where the property names refer to keys of the map See Abschnitt 8 5 Dynamische Komponenten for more information 5 1 16 Properties The lt properties gt 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 Itis also a convenient way to define a multi column unique constraint For example lt properties name logicalName insert true false update true false optimistic lock true false 000009 unique true false 87 Kapitel 5 Grundlagen des O R lt PEOPET EY 0 i lt many to one gt lt properties gt name the logical name of the grouping It is not an actual property name insert do the mapped columns appear in SQL INSERTs update do the mapped columns appear in SQL upDATEs 90898 optimistic lo
393. where prod name widget and store location name in Melbourne Sydney and prod all elements cust currentOrder lineltems 220 Die Reihenfolge nach Klausel Tipp etwas wie SELECT cust name cust address cust phone cust id cust current_order FROM customers cust stores store locations loc store_customers sc product prod WHERE prod name widget AND store loc_id loc id AND loc name IN Melbourne Sydney AND sc store_id store id AND sc cust_id cust id AND prod id ALL SELECT item prod_id FROM line_items item orders o WHERE item order_id o id AND cust current_order o id 15 11 Die Reihenfolge nach Klausel The list returned by a query can be ordered by any property of a returned class or components from DomesticCat cat order by cat name asc cat weight desc cat birthdate Die optionalen asc oder desc zeigen die aufsteigende bzw absteigende Reihenfolge an 15 12 Die Gruppe nach Klausel A query that returns aggregate values can be grouped by any property of a returned class or components select cat color sum cat weight count cat from Cat cat group by cat eoler select foo id avg name max name from Foo foo join foo names name group by foo id Eine having Klausel ist ebenfalls gestattet select cat color sum cat weight count cat 221 Kapitel 15 HQL Die Hiberna from Cat cat group by cat color having cat color in eg Color TABBY eg Col
394. with conflicts with existing rows in the database ReplicationMode IGNORE ignores the object when there is an existing database row with the same identifier ReplicationMode OVERWRITE overwrites any existing database row with the same identifier ReplicationMode EXCEPTION throws an exception if there is an existing database row with the same identifier ReplicationMode LATEST_VERSION overwrites the row if its version number is earlier than the version number of the object or ignore the object otherwise Anwendungsf lle dieses Features beinhalten die Abstimmung von in verschiedenen Datenbankinstanzen eingegebenen Daten das Upgrade von Systemkonfigurationsinformationen w hrend Produkt Upgrades die Wiederholung von w hrend nicht ACID Transaktionen gemachten nderungen und mehr 10 10 Das R umen der Session Sometimes the Session will execute the SQL statements needed to synchronize the JDBC connection s state with the state of objects held in memory This process called flush occurs by default at the following points 165 Kapitel 10 Das Arbeiten mit vor dem Ausf hren einiger Anfragen e von org hibernate Transaction commit e von Session flush The SQL statements are issued in the following order 1 all entity insertions in the same order the corresponding objects were saved using Session save alle Entity Aktualisierungen alle Collectio
395. work is a design pattern described by Martin Fowler as maintaining a list of objects affected by a business transaction and coordinates the writing out of changes and the resolution of concurrency problems PoEAA In other words its a series of operations we wish to carry out against the database together Basically it is a transaction though fulfilling a unit of work will often span multiple physical database transactions see Abschnitt 12 1 2 181 Kapitel 12 Transactions and Lange Konversationen So really we are talking about a more abstract notion of a transaction The term business transaction is also sometimes used in lieu of unit of work Do not use the session per operation antipattern do not open and close a Session for every simple database call in a single thread The same is true for database transactions Database calls in an application are made using a planned sequence they are grouped into atomic units of work This also means that auto commit after every single SQL statement is useless in an application as this mode is intended for ad hoc SQL console work Hibernate disables or expects the application server to disable auto commit mode immediately Database transactions are never optional All communication with a database has to occur inside a transaction Auto commit behavior for reading data should be avoided as many small transactions are unlikely to perform better than one clearly defined uni
396. xResults 10 List cats gr last Hibernate wei wie die Grenzanfrage in die native SQL Ihres DBMS zu bersetzen ist 10 4 1 6 Scrollbare Iteration If your JDBC driver supports scrollable Resultsets the Query interface can be used to obtain a ScrollableResults Object that allows flexible navigation of the query results Query q sess createQuery select cat name cat from DomesticCat cat order by cat name ScrollableResults cats q scroll if cats bl este O 9 find the first name on each page of an alphabetical list of cats by name firstNamesOfPages new ArrayList do String name cats getString 0 firstNamesOfPages add name while cats scroll PAGE_SIZE Now get the first page of cats pageOfCats new ArrayList cals bef rerirst int i 0 while PAGE_SIZE gt itt amp amp cats next pageOfCats add cats get 1 cats close Note that an open database connection and cursor is required for this functionality Use setMaxResult setFirstResult if you need offline pagination functionality 10 4 1 7 Externalisierung benannter Anfragen You can also define named queries in the mapping document Remember to use a CDATA section if your query contains characters that could be interpreted as markup lt query name ByNameAndMaximumWeight gt lt CDATA from eg DomesticCat as cat where cat name and cat weight eR gt lt query 159
397. xml If you prefer to have more verbose output than that provided in the example configuration you can change the settings By default only the Hibernate startup message is shown on stdout The tutorial infrastructure is complete and you are now ready to do some real work with Hibernate 1 1 7 Das Laden und Speichern von Objekten We are now ready to start doing some real work with Hibernate Let s start by writing an EventManager Class with a main method package org hibernate tutorial import org hibernate Session import java ut import org hibernate tutorial domain Event import org hibernate tutorial util HibernateUtil public class EventManager public static void main String args EventManager mgr new EventManager if args 0 equals store mgr createAndStoreEvent My Event new Date HibernateUtil getSessionFactory close private void createAndStoreEvent String title Date theDate Session session HibernateUtil getSessionFactory getCurrentSession session beginTransaction Event theEvent new Event theEvent setTitle title theEvent setDate theDate session save theEvent session getTransaction commit 11 Kapitel 1 Tutorial In createAndStoreEvent we created a new Event object and handed it over to Hibernate At that point Hibernate takes care of the SQL and executes an INSERT on the database A org hibernate Ses
398. y class to a table in isolation Let s expand on that a bit and add some class associations We will add people to the application and store a list of events in which they participate 1 2 1 Das Mappen der Personenklasse The first cut of the Person class looks like this package org hibernate tutorial domain public class Person private Long id private int age private String firstname private String lastname public Person Accessor methods for all properties private setter for id Save this to a file named src main java org hibernate tutorial domain Person java Next create the new mapping file as src main resources org hibernate tutorial domain Person hbm xml lt hibernate mapping package org hibernate tutorial domain gt lt class name Person table PERSON gt lt id name id column PERSON_ID gt lt generator class native gt lt id gt lt property name age gt lt property name firstname gt lt property name lastname gt lt class gt lt hibernate mapping gt Anschlie end f gen Sie dann das neue Mapping der Konfiguration von Hibernate hinzu lt mapping resource events Event hbm xml gt lt mapping resource events Person hbm xml gt 14 Eine unidirektionale Set basierte Assoziation Create an association between these two entities Persons can participate in events and events have participants The design questions you have to deal with are
399. y name For example you can specify a charSet connection property using hibernate connection charSet You can define your own plugin strategy for obtaining JDBC connections by implementing the interface org hibernate connection ConnectionProvider and specifying your custom implementation via the hibernate connection provider_class property 3 4 Optionale Properties der Konfiguration There are a number of other properties that control the behavior of Hibernate at runtime All are optional and have reasonable default values Warnung Some of these properties are system level only System level properties can be set only via java Dproperty value Of hibernate properties They cannot be set by the other techniques described above Tabelle 3 3 Konfigurationseigenschaften von Hibernate Property Name Zweck hibernate dialect The classname of a Hibernate org hibernate dialect Dialect which allows Hibernate to generate SQL optimized for a particular relational database e g full classname of Dialect In most cases Hibernate will actually be able to choose the correct org hibernate dialect Dialect 36 Optionale Properties der Konfiguration Property Name hibernate show_saql hibernate format_sq hibernate default_schema hibernate default_catalog hibernate session_factory_name hibernate max_fetch_depth hibernate default_batch_fetch_size hibernate default_entity_mode hibernate order_updates
400. ze the SQL it uses to read and write the values of columns mapped to simple properties For example if your database provides a set of data encryption functions you can invoke them for individual columns like this lt property name creditCardNumber gt lt column name credit_card_num read decrypt credit_card_num write encrypt gt lt property gt Hibernate applies the custom expressions automatically whenever the property is referenced in a query This functionality is similar to a derived property formula with two differences The property is backed by one or more columns that are exported as part of automatic schema generation The property is read write not read only The write expression if specified must contain exactly one placeholder for the value 5 8 Auxiliary database objects 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 java sql Statement execute method is valid for example ALTERs INSERTS etc There are essentially two modes for defining auxiliary database objects The first mode is to explicitly list the CREATE and DROP commands in the mapping file lt hibernate
Download Pdf Manuals
Related Search
Related Contents
SMCWBR14S-N3 QIG R02 front.ai - Edge-Core 女児玩具 「こえだちゃんの木のおうち」 新発売! Emerson 500-1250KW Diagrams and Drawings Spring `14 - LPT Home Page - HP LaserJet and Lexmark Parts Quantum Travan 20 ATAPI User's Guide 2.0 Instruções de utilização AADIP_Chapter 6 - Intel® Developer Zone Samsung 32" Curved TV J6300 Series 6 取扱説明書 Copyright © All rights reserved.
Failed to retrieve file