Archiv der Kategorie: Hibernate

Hibernate neue Sequence einfügen

Wenn man im Projekt „nur“ Integer als Primary Key zur Verfügung hat und ein Refactoring ist nicht abzuschätzen, so kann man für besonders zahlreiche Entities eigene Sequencen anlegen.


@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tsgen")
@SequenceGenerator(name = "tsgen", sequenceName = "sq_t_timeseries_data", allocationSize = 1, initialValue = 7000000)
@Column(insertable = false, updatable = false)

Nicht vergessen den aktuellen respektive initialen Wert zu setzen. Bei PostgreSQL war es notwendig, nach dem Schema-Update von Hibernate, den „CurrentValue“ manuell noch einmal anzupassen.

Ebenfalls empfehlenswert ist allocationSize = 1 zu setzen, da sonst in 50ger Schritten die Schlüssel bezogen werden.

Lift auf neues Hibernate 3.6.0.Final

Für ein Lift reichte im Wesentlichen folgender POM-Eintrag im Parent-POM

<!-- Core and annotations -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.6.0.Final</version>
</dependency>
<!-- Cache provider second level cache, we use NoCache -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.2.0</version>
</dependency>
<!-- need to run with hibernate -->
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.8.0.GA</version>
</dependency>

Die Basis-Annotations sind schon im Core-Paket enthalten. Dies macht es einfacher.
Allerdings muss man die entsprechenden Abhängigkeiten aus dem JBOSS-Repository holen: https://repository.jboss.org/nexus/content/groups/public/

Für ein Logging musste ebenfalls angepasst werden auf eine neue API


<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jcl</artifactId>
<version>1.6.1</version>
</dependency>

Um für z. B. Tests das Caching abzuschalten, wird Folgendes eingetragen:


<prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.cache.use_query_cache]">false</prop>

Siehe hierzu auch z. B.: stackoverflow

Hibernate-Listen-Falle: @IndexColumn

Gegeben sei eine Entity A mit einer One2Many-Beziehung zu z. B. History-Einträgen. Diese Beziehung ist geordnet, also eine Liste.

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@IndexColumn(name = „position“)
@JoinTable(name=“T_A2HISTORY“)
protected List<HistoryDO> getHistory() {

Vergisst man @IndexColumn, so kann es sein wie unter HSQL-DB, dass alles funktioniert z. B. in einem Unit-Test. Unter Oracle hingegen erhält man mitunter den eigentlich einzigen Eintrag in der History-Tabelle mehrfach, je nach (Join)-Fetch-Strategie.

Auch sollte die IndexColumn wie üblich keine Schlüsselwörter von den Zieldatenbanken enthalten und auch keine gemappte Property betreffen. (Ich hatte da zumindest sonst Schwierigkeiten.)