2010-01-21 10 views
7

W mojej aplikacji internetowej mam obszar tekstowy, którego zawartość wypełniona przez użytkownika jest ostatecznie utrwalona w db z Hibernate. Wystąpił problem, że gdy dane wprowadzane przez użytkownika przekraczają określoną długość, trwałość kończy się niepowodzeniem. Czy istnieje sposób wskazania za pomocą adnotacji Hibernate lub konfiguracji, w której to konkretne pole powinno obsługiwać dłuższe łańcuchy i że typ kolumny bazy danych powinien to odzwierciedlać?Problem utrzymujący długie ciągi z Hibernate

Oto wyjątek że ja dostaję:

Caused by: java.sql.BatchUpdateException: Data truncation: Data too long for column 'introText' at row 1 
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2007) 
    at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1443) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
    ... 41 more 
+0

Dlaczego mówisz to się nie powiedzie? czy po cichu obcina łańcuch w backendach czy pojawia się komunikat o błędzie? Jeśli powiesz hibernacji, że jest to typ łańcucha, spróbuje zapisać wszystko. –

+0

Zawartość użytkownika jest ustawiona w obiekcie String. Wyjątek jest wyrzucany podczas utrzymywania. – lupefiasco

+0

Czy możesz umieścić wyjątek w swoim poście? :) i być może fragment z twojego aktualnego mapowania. –

Odpowiedz

20

Można użyć parametru długości na adnotacji, tak jak poniżej:

@Column(length=1000) 

czy można zmienić typ kolumny, aby coś podobnego tekst, jeśli baza danych obsługuje go, tak jak:

@Column(columnDefinition="text") 

Jeśli używasz aktualizacji hbm2ddl , a kolumna zostanie utworzona w celu użycia tego typu zamiast (specyficzne dla bazy danych).

+2

tylko po to, by uzupełnić, tutaj długość musi być int, a zatem @Column (length = 1000) – Thomas

+1

Dla naszego projektu chcemy mieć bazę danych psql używając typu VARCHAR dla niektórych kolumn bez określonego rozmiaru. Do tego używamy: @ Column (columnDefinition = "VARCHAR") – mahler

+0

Zwłaszcza, że ​​w PostgreSQL "varchar" jest taki sam jak "text". http://stackoverflow.com/questions/4848964/postgresql-difference-between-text-and-varchar-character-varying – tgharold

0

ok, faktycznie jest to błąd DB.

Data too long for column 'introText' 

sprawdź kolumnę introText w twoim DB i jest to prawdopodobnie varchar, który ma tylko ograniczony rozmiar. Będziesz musiał zmienić typ pamięci na większy, aby nie obciął Twojego tekstu.

Jeśli uważasz, że tak nie jest, musisz pokazać swoje mapowanie i schemat.

5

Miałem podobny problem, który ja rozwiązać poprzez przypisanie hibernacji „tekst” typ do posesji:

@Type(type="text") 
Powiązane problemy