Zajmuję się tworzeniem aplikacji przy użyciu:Prawidłowe JPA Adnotacja dla PostgreSQL typu tekstowego bez Hibernate Annotations
- Java 1.7
- WZP (wliczone w JavaEE-API 7.0)
- hibernacji 4.3.8.Final
- PostgreSQL JDBC 9.4-1200-jdbc41
- PostgreSQL 9.3.6
Chciałbym użyć typu danych PostgreSQL dla niektórych atrybutów String. O ile mi wiadomo, w JPA to powinien być prawidłowy adnotacji, aby użyć tekstu w PostgreSQL:
@Entity
public class Product{
...
@Lob
private String description;
....
}
Kiedy opisywanie podmiot, tak, że napotkasz błędy, które wyglądają tak: http://www.shredzone.de/cilla/page/299/string-lobs-on-postgresql-with-hibernate-36.html
W skrócie: Wygląda na to, że hibernacja i jdbc nie idą w parze ze znakami typu clob/text.
Rozwiązanie opisane pracuje:
@Entity
public class Product{
...
@Lob
@Type(type = "org.hibernate.type.TextType")
private String description;
...
}
Ale to ma znaczący wadę: Źródło potrzeby kod hibernacji w czasie kompilacji, która powinna być zbędna (jest to jeden z powodów, dla użyciem JPA w pierwszej kolejności).
Innym sposobem jest użycie adnotacji kolumny tak:
@Entity
public class Product{
...
@Column(columnDefinition = "text")
private String description;
...
}
który działa ładnie, ALE: teraz utknąłem z bazami danych, które mają typ tekstu (i nazywa się również tekst;)) i jeśli w przyszłości będzie używana inna baza danych, adnotacje można łatwo przeoczyć. W związku z tym możliwy błąd może być trudny do znalezienia, ponieważ typ danych jest zdefiniowany w łańcuchu znaków i dlatego nie można go znaleźć przed uruchomieniem.
Czy istnieje rozwiązanie, które jest takie proste, po prostu go nie widzę? Jestem pewien, że nie jestem jedynym użytkownikiem używającym JPA w połączeniu z Hibernate i PostgreSQL. Więc jestem nieco zdezorientowany, że nie mogę znaleźć więcej takich pytań.
Wystarczy wypełnić pytanie, persistence.xml wygląda następująco:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="entityManager">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.app.model.Product</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
<property name="javax.persistence.jdbc.url"
value="jdbc:postgresql://localhost:5432/awesomedb" />
<property name="javax.persistence.jdbc.user" value="usr" />
<property name="javax.persistence.jdbc.password" value="pwd" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.jdbc.use_streams_for_binary" value="false" />
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
<property name="show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
UPDATE:
Ten problem jest bardziej lub mniej równoważne z tym pytaniu odebrał odpowiedź to drugi sposób, aby zrobić to opisane w tym pytaniu, którego nie podoba mi się ze względu na zależność środowiska wykonawczego hibernacji: store strings of arbitrary length in Postgresql
To wydaje się być związane z rodzajem: https://hibernate.atlassian.net/browse/JPA-48
Odkąd mówisz o tym, co tak naprawdę jest problemem z instalacją (automatycznie generowanym DDLem), nie możesz po prostu ręcznie utworzyć tabeli jako TEKST w Postgresie i po prostu nie określać niczego w klasie? – chrylis
Tak, chciałbym móc wygenerować DB ze stanu hibernacji. – knoe
A więc ... chcesz użyć niestandardowej funkcji SQL, ale nie chcesz ryzykować niekompatybilności z bazami danych, które nie mają niestandardowej funkcji? – chrylis