JAVA - JPA(TopLink) + MySQL

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
nonus25
Piegowaty Guziec
Piegowaty Guziec
Posty: 17
Rejestracja: 05 wrz 2008, 20:45
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

JAVA - JPA(TopLink) + MySQL

Post autor: nonus25 »

Witam

Ma pytanie odnośnie framework'a JPA, mianowicie podczas pierwszego mapowania tabele się tworzą w bazie wszystko przebiega ładnie i w logach serwera nie dostaje żadnych zbędnych komunikatów. Teraz przy chęci dodania znowu jakiś wartości do bazy dostaje komunikat że tabele już istnieją. Co jest rzeczą oczywistą, że one tam są.

Kod: Zaznacz cały

[TopLink Info]: 2010.09.14 04:22:49.196--ServerSession(1721336021)--TopLink, version: Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))
[TopLink Info]: 2010.09.14 04:22:49.595--ServerSession(1721336021)--file:/home/nonus25/NetBeansProjects/jpaMySQL/build/classes/-jpaMySQLPU login successful
[TopLink Warning]: 2010.09.14 04:22:49.624--ServerSession(1721336021)--Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'STUDENCI' already exists
Error Code: 1050
Call: CREATE TABLE STUDENCI (ID BIGINT NOT NULL, nazwisko VARCHAR(255), imie VARCHAR(255), grupa_dziekanska BIGINT, PRIMARY KEY (ID))
Query: DataModifyQuery()
[TopLink Warning]: 2010.09.14 04:22:49.629--ServerSession(1721336021)--Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'SGROUP' already exists
Error Code: 1050
Call: CREATE TABLE SGROUP (ID BIGINT NOT NULL, group_name VARCHAR(255), PRIMARY KEY (ID))
Query: DataModifyQuery()
[TopLink Warning]: 2010.09.14 04:22:49.702--ServerSession(1721336021)--Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'SEQUENCE' already exists
Error Code: 1050
Call: CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT DECIMAL(38), PRIMARY KEY (SEQ_NAME))
Query: DataModifyQuery()


Teraz pytanie czy zna ktoś jakąś sztuczkę aby się pozbyć tego błędu 1050 ??
Może istnieje jakiś sposób aby poinformować JPA, że tabele już istnieją i chcemy tylko dodać rekordy??
ps. rekordy się dodają do bazy, tylko zastanawiam się czy z czasem przy większej ilości danych nie będzie to miało wpływu na działanie bazy ??
Awatar użytkownika
mate_haru
Sędziwy Jeż
Sędziwy Jeż
Posty: 47
Rejestracja: 05 paź 2006, 12:42
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: Fluxbox
Architektura: x86_64
Kontakt:

Odp: JAVA - JPA(TopLink) + MySQL

Post autor: mate_haru »

Jak na moje oko, to sprawa rozbija się o to, że masz w swojej aplikacji (prawdopodobnie persistence.xml) ustawione tworzenie i wykonywanie skryptu ddl, który próbuje przy każdym starcie systemu stawiać całą bazę. Stawiam na property:

Kod: Zaznacz cały

<property name="toplink.ddl-generation" value="create-tables"/>
Chyba, że taka opcja jest domyślna i jej nie będziesz miał (możliwe - nie wiem jak funkcjonuje JPA + TopLink). Zainteresuj się tym jakie wartości może to property przyjmować. TopLinka nie używałem nigdy, ale w Hibernate jest property o nazwie hibernate.hbm2ddl.auto - ustawia się to na "update" i tabele są zmieniane tylko w przypadku zmian w modelu danych, który te tabele tworzy.

Pozdrawiam
nonus25
Piegowaty Guziec
Piegowaty Guziec
Posty: 17
Rejestracja: 05 wrz 2008, 20:45
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: JAVA - JPA(TopLink) + MySQL

Post autor: nonus25 »

Dzięki za podpowiedz

W sumie się przydała nawet bardzo. Sprawa banalna aczkolwiek nie poradziłem sobie z nią bez podpowiedzi. Dokładnie mówiąc trzeba usunąć całą linijkę

Kod: Zaznacz cały

    <property name="toplink.ddl-generation" value="create-tables"/>

lub też zaznaczyć none przy konfiguracji pliku persistence.xml.

Teraz jak uzyskać zmianę tej wartości automatycznie, napisać program do edycji takiego pliku, czy też jest jakiś inny znacznik który zmieni to za nas ??
Awatar użytkownika
mate_haru
Sędziwy Jeż
Sędziwy Jeż
Posty: 47
Rejestracja: 05 paź 2006, 12:42
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: Fluxbox
Architektura: x86_64
Kontakt:

Odp: JAVA - JPA(TopLink) + MySQL

Post autor: mate_haru »

Nie jest potrzebny żaden program - nie ma większego sensu dla tak małej rzeczy. Projekt jest w fazie rozwoju, cały czas jest przebudowywany, a zatem zwyczajową praktyką jest wykonywanie tej drobnej zmiany za każdym razem, gdy model się zmieni i włączenie jej do aktualnego buildu. System startuje, tabele się uaktualniają i zmianę się cofa. W momencie, gdy projekt będzie odpowiednio dojrzały (żadne zmiany na modelu już się nie zadzieją lub po prostu system stanie na produkcji... czy gdziekolwiek), to tego property już w ogóle się nie rusza. Najlepszą jednak praktyką jest takie skonfigurowanie JPA, aby zaciągało konfigurację z zewnętrznego pliku properties. Przykładowo jeżeli korzystasz z tomcata, możesz taka konfigurację umieścić w pliku /conf/nazwa_projektu/jdbc.properties. W takim pliku znajdą się informacje dot. stricte środowiska, na którym jest uruchamiany system - i między innymi interesujący Ciebie przełącznik dot. DDLa. Teraz za każdym razem, gdy będziesz chciał uaktualnić model/zmienić dane dostępowe do bazy/kodowanie znaków podczas połączenia z bazą etc. wystarczy zmiana w tym pliku properties i restart aplikacji (bez konieczności przebudowy).
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 9 gości