# hibernate Frage zu configFile-Pfad und Groß/Kleinschreibung von Postgres-Tabellen



## rtx05 (28. Apr 2010)

Guten Morgen,

ich beschäftige mich seit ein paar tagen mit Hibernate und habe ein Problem mit dem Pfad der ConfigDatei, die ich ja mit


```
String configFile="/home/theUser/config/hibernate.cfg.xml"

AnnotationConfiguration().configure(configFile);
```

übergeben kann.

Nur wird die Datei nicht gefunden. I
ch weiß, dass es funktioniert, wenn ich die "hibernate.cfg.xml" irgendwo in der Packagestruktur ablege, und dann so referenziere: "de/mypackage/database/access/hibernate.cfg.xml".

Aber ich würde gerne die Config-Datei dann nicht im JAR haben wollen, sondern in einem config-Verzeichnis, wo man (als User), die Settings anpassen kann. 

Geht dies irgendwie?


Ein weiteres Problem:

Ich habe eine Postgres Datenbank zum Einarbeiten mit der Tabelle "Test" (großes T!) und einer Spalte "name" Varchar(255)
und die passende (Entity-)Klasse dazu.


```
session.createQuery("Select t from Test as t");
```

funktioniert nicht.

Die Hibernate-Exception besagt:* "relation test not found" *(Auffällig ist, dass er die Relation test klein schreibt)

Ich habe in der Datenbank die Tabelle *"Test" gelöscht  und als "test" (klein) *neu angelegt, *und dann funktionert es*!

Die eigentlichen Anwendung soll jedoch auf einer bereits bestehenden Datenbank mit > 100 Tabellen (Tabellennamen sind in Groß/Kleinschreibung angelegt).

Habe ich etwas vergessen zu konfigurieren?


----------



## Gast2 (28. Apr 2010)

Zum zweiten:

Ich wüsste nicht das Postgres Casesenstiv ist was Tabellen und Spaltennamen angeht. Kurzer Test bei mir hat das bestätigt.

Und wenn es nicht wirklich zwingend nötig ist würde ich bei Postgres nicht VARCHAR nutzen sondern direkt "text"


----------



## rtx05 (28. Apr 2010)

okay meine erste Frage, konnte ich auflösen

Es gibt 


```
configure(File aFile)
```

die auch ausserhalb der Resourcenpfade referenziert



```
String configFile="/home/theUser/config/hibernate.cfg.xml" 
AnnotationConfiguration().configure(new File(configFile));
```

Bei mir unterscheidet PosgresSQL wohl case-sensitiv:

CREATE TABLE Test  == CREATE TABLE test   beides wird als Tabelle  test angelegt

CREATE TABLE "Test" <> CREATE TABLE "test" => jeweils wie geschrieben.

Ob das Auswirkungen auf SQL-Statements hat - via JDBC abgesetzt - keine Ahnung. 

Muss mal weitersuchen.


----------



## Gast2 (29. Apr 2010)

rtx05 hat gesagt.:


> CREATE TABLE Test  == CREATE TABLE test   beides wird als Tabelle  test angelegt
> 
> CREATE TABLE "Test" <> CREATE TABLE "test" => jeweils wie geschrieben.



Das ist klar. Wenn du die Objektnamen in Anführungszeichen setzt ist das casesensitiv. Das ist Stanard und bei MySQL und Oracle auch so.


----------



## rtx05 (29. Apr 2010)

Wie gesagt: die DB (und somit die Tabellen) sind schon existent (dies muss ich so übernehmen)

Wenn ich mir via pgAdminIII die CREATE - Skripte anschaue z.B. :

```
CREATE TABLE "Kalender"
(
  "Datum" character(8),
  "WochenNr" character(2),
  "Wochentag" character(1),
  "Werktag" character(1),
  "Samstag" character(1),
  "Sonntag" character(1),
  "Feiertag" character(1),
  "Feiertags_Bezeichnung" character(30)
)
WITH (
  OIDS=FALSE
);
```

ist ja ersichtlich, dass hier case-sensitive Tabellen erzeugt wurden (ich nehme an der DB-Admin war sich dessen damals nicht bewußt - was mir auch nicht weiterhilft im Moment).

Auch direkte SELECT-Anweisungen via pgAdminIII unterscheiden in den Namen:


```
SELECT * FROM kalender
SELECT * FROM Kalender
SELECT * FROM "kalender"
```

gibt folgendes aus



```
FEHLER:  Relation »kalender« existiert nicht
LINE 5: SELECT * FROM kalender
```

und


```
FEHLER:  Relation »kalender« existiert nicht
LINE 6: SELECT * FROM Kalender
```

und


```
FEHLER:  Relation »kalender« existiert nicht
LINE 6: SELECT * FROM "kalender"
```

Nur


```
SELECT * FROM "Kalender"
```

ist korrekt.

Damit kann ich auch leben, aber ich weiß nicht wie ich den Name für Hibernate quotiere:

versucht habe ich schon:


```
session.createQuery("Select t from 'Test' as t");
session.createQuery("Select t from \"Test\" as t");
```

Hierzu bräuchte ich eine Aussage, ob dies irgendwie möglich ist und wenn ja wie!


----------



## mvitz (29. Apr 2010)

Ohne jetzt der Hibernate Spezialist zu sein. In der HQL (Hibernate Query Language) beziehst du dich doch garnicht auf die Namen der Tabellen, sondern deiner Entitäten, d.h. heißt die Klasse Test so brauchst du im HQL-Query auch nur 

```
session.createQuery("Select t from Test as t");
```

Was du dann allerdings benötigst, ist die Angabe des Tabellennamens bei deiner Entität über @Table


----------



## rtx05 (29. Apr 2010)

hmm, ja danke für den Hinweis, ich habe auch gerade was gefunden in diese Richtung.

meine bestehende Entität:


```
@Entity
@Table(name="Test")
class Test {
...
}
```

hier muss wohl im Attribut *name *von *@Table* der Tabellenname in _Backticks (`)_ gequotet werden.

```
@Table(name="[B]`[/B]Test[B]`[/B]")
```

Die _Backticks_ werden wohl von Hibernate je nach SQL-Dialect in die richtigen Quotes, wie ", `, ' etc. umgesetzt.

Werde dies heute Nachmittag testen.


----------



## Gast2 (29. Apr 2010)

rtx05 hat gesagt.:


> ist ja ersichtlich, dass hier case-sensitive Tabellen erzeugt wurden (ich nehme an der DB-Admin war sich dessen damals nicht bewußt - was mir auch nicht weiterhilft im Moment).



Hmm das ist echt doof - dafür gehört der DBA geprügelt wenn er das "aus Versehen" gemacht hat. Ist meiner Meinung nach ein ganz schlechter Stil und ich würd das echt nicht so lassen.


```
ALTER TABLE "Kalender" RENAME TO Kalender;
ALTER TABLE kalendar RENAME COLUMN "Datum" TO datum;
...
```


```
SELECT * FROM kalender
```

Dazu würd  ich die Schmeaobjekteaus dem Katalog ziehen und automatisch einmal ein Skript drüberrappeln lassen das alle Tabellen und Spalten in nicht case sensitive Objekte umbenennt. Das ist vielleicht eine Stunde Arbeit aber spart eine Menge Ärger in der Zukunft. 

Überleg mal wie lange alleine du jetzt gebraucht hast um Nachforschungen anzustellen... kannst ja mal in Arbeitsstunden ausrechnen und damit im schlimmsten Fall deinem Chef sagen das jeder neue Entwickler bei einem neuen Feature auch nochmal etliche Stunden versenken wird


----------



## rtx05 (29. Apr 2010)

Nur der Vollständigkeit halber, das mit den Quotes funktioniert

@fassy:

Ja das mit den Namen ist schon doof - muss abklären - ob andere Anwendung von der Namensumstellung negativ betroffen wären.


----------

