1.1.14.7.4. fejezet, Hibernate jegyzetek

@ManyToMany examples

    //Example 1:
 
    //In Customer class:
 
    @ManyToMany
    @JoinTable(name="CUST_PHONES")
    public Set<PhoneNumber> getPhones() { return phones; }
 
    // In PhoneNumber class:
 
    @ManyToMany(mappedBy="phones")
    public Set<Customer> getCustomers() { return customers; }
 
    //Example 2:
 
    // In Customer class:
 
    @ManyToMany(targetEntity=com.example.PhoneNumber.class)
    public Set getPhones() { return phones; }
 
    // In PhoneNumber class:
 
    @ManyToMany(targetEntity=com.example.Customer.class, mappedBy="phones")
    public Set getCustomers() { return customers; }
 
    //Example 3:
 
    // In Customer class:
 
    @ManyToMany
    @JoinTable(name="CUST_PHONE",
        joinColumns=
            @JoinColumn(name="CUST_ID", referencedColumnName="ID"),
        inverseJoinColumns=
            @JoinColumn(name="PHONE_ID", referencedColumnName="ID")
        )
    public Set<PhoneNumber> getPhones() { return phones; }
 
    // In PhoneNumberClass:
 
    @ManyToMany(mappedBy="phones")
    public Set<Customer> getCustomers() { return customers; }

NamedQuery

Előre parszolt lekérdezéseket alkalmazhatunk az adatok hatékonyabb lekérdezéséhez, ha nevesített sablon leválogatókat használunk ott, ahol tudunk.

@NamedQueries({
    @NamedQuery(
    name = "imageByUser",
    query = "from Image i where i.user = :user"
    ),
    @NamedQuery(
    name = "imageByCategory",
    query = "from Image i where i.category = :category"
    )
})
@Entity
public class Image implements Serializable {
...
}

Ezek után a lekérdezés használata a következő (figyeljük meg, hogy egy teljes objektumot kell átadni paraméterként):

query = getSession(false).getNamedQuery("imageByCategory");
query.setParameter("category", categoryFilter);

Nagy méretű adatok kezelése

Különböző adatbázis szerverekhez illeszkedő Hibernate-el nem is olyan könnyű megtalálni a helyes adattárolási formát, ha azt szeretnénk, hogy többféle adatbázison fusson programunk. Néhány tipusnál az alábbiakat használhatjuk eredményesen:

@Lob
private String valamiProperty;
//MySQL 5.5.20 : largeText
//Oracle 11g : CLOB
//PostgreSQL 9.1 : text
//MS-SQL 2008 : varchar(MAX)
@Lob
private byte[] valamiProperty;
//BLOB

Idegen kulcsok kezelése

MS-SQL 2008-al a perzisztens objektumokhoz tartozó táblák eldobása és létrehozása nem tökéletes. Az idegen kulcsok eldobása előtt a táblát dobná el a szerver, de mivel idegen kulcs hivatkozik rá, ezért sikertelen a kísérlet. Kézzel kell összeállítani egy szkriptet, ami elvégzi a piszkos munkát.

MySQL-ben az idegen kulcsok eldobása:

ALTER TABLE child DROP FOREIGN KEY parentid_fk;

Sorba rendezés

MySQL 5.5.20, Oracle 11g és MS-SQL a betűk sorba rendezésénél ezt a sorrendet állapítja meg: A,a,Á,á, ...

PostgreSQL 9.1-nél megelőzi a kisbetű a nagybetűt.

Dialektusok

RDBMS Dialect
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 with InnoDB org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version) org.hibernate.dialect.OracleDialect
Oracle 9i org.hibernate.dialect.Oracle9Dialect
Oracle 11g org.hibernate.dialect.Oracle10Dialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server org.hibernate.dialect.SQLServerDialect
SAP DB org.hibernate.dialect.SAPDBDialect
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

Hibernate validáció

Hiberate érték ellenőrző beállítása JSF komponenseken (WebContent/WEB_INF/faces-config.xml):

    <application>
        <message-bundle>JsfMessageResources</message-bundle>
    </application>

JsfMessageResources_hu.properties az src könyvtárban:

#
# Overrides default pattern in JSF for Bean Validation messages from "{0}" to "{1} {0}" where
# the {0} is the Bean Validation constraint message (e.g. "may not be empty") and {1} is the
# field name or the field label if defined (e.g. "First name").
#
javax.faces.validator.BeanValidator.MESSAGE={1} {0}

ValidationMessages_hu_HU.properties az src könyvtárban:

org.hibernate.validator.constraints.Email.message=Hibásan formázott e-mail cím
org.hibernate.validator.constraints.NotEmpty.message=Nem lehet üres érték
org.hibernate.validator.constraints.NotNull.message=Nem lehet null érték

Adatbázisból Hibernate domain objektumok gyártása

Ez a funkció nagyon hasznos, ha Quartz táblákból szeretnénk osztályokat gyártani a Hibernate számára.

Eclipse-ben szükségünk lesz a JBoss Tools kiegészítőre, amit a help/Eclipse Marketplace-en keresztül telepíthetünk.

Készítsünk egy Java Projektet, majd ebbe egy Hibernate konfigurációt (file/new/Other.. /Hibernate/Hibernate Configuration file (cfg.xml), egy Hibernate konzol konfigurációt (file/new/Other.. /Hibernate/Hibernate Console Configuration) és egy Hibernate visszafejtő konfigurációt (file/new/Other.. /Hibernate/Hibernate Reverse Engeneering file (reveng.xml)

Váltsunk át Hibernate perspektívára, majd a Run hibernate.reveng.xml gombot legördítve Hibernate Code Generation Configurations... menüponban konfiguráljuk a visszafejtés futtatását. Itt a generálást is elindíthatjuk.

Hasznos hivatkozások:

  • Hibernate reverse engeenering
  • Hibernate OpenSession in View, avagy miért ne kapcsoljuk servlet session-hoz a hibernate session-t.
  • Miért használjuk request-hez kapcsolva a Hibernate openSession.
  • JPA with Hibernate on Glassfish 3
  • BoneCP (Connection pool)
  • Fetching strategies