Неверное отображение для атрибута длины в JPA @Column - PullRequest
3 голосов
/ 26 декабря 2011

Я использую Hibernate 4.0.0.Final в качестве поставщика сохраняемости JPA для приложения, с базой данных Oracle 11g (созданной с кодировкой UTF-8) и Oracle WebLogic 11g в качестве сервера приложений.В persistence.xml настроен диалект: org.hibernate.dialect.OracleDialect.

. В моих сущностях я сопоставляю строковые поля следующим образом:

@Column(length=20)
private String description;

Я позволяю JPA обрабатывать созданиетаблицы в базе данных.К моему удивлению, в базе данных определение столбца для предыдущего поля выглядит следующим образом:

DESCRIPTION VARCHAR2(80 BYTE)

Когда я вставляю значение в поле description (используя консоль SQL, а не из приложения),Я могу вставить до 80 символов, а не 20, как я ожидал.

В чем здесь проблема?Я предполагаю, что определение столбца создано с 80 байтами для разрешения хранения символов UTF-8, но оно не соответствует ожидаемой максимальной длине поля на уровне базы данных.В идеале я хотел бы, чтобы поле выглядело так:

DESCRIPTION VARCHAR2(20 CHAR)

Но я не знаю, как настроить Hibernate для отображения строкового поля с CHAR, а не BYTE.Есть идеи?

1 Ответ

3 голосов
/ 27 декабря 2011

Тот факт, что я использовал в качестве диалекта org.hibernate.dialect.OracleDialect, вызвал проблему. Я копался в исходном коде, и эта строка появляется в классе OracleDialect:

registerColumnType( Types.VARCHAR, 4000, "varchar2($l)" );

На самом деле это была известная проблема . По умолчанию Oracle генерирует varchar2($l byte) для предыдущего определения. Если я переключусь на org.hibernate.dialect.Oracle10gDialect, рекомендуемый диалект для Oracle 11g, предыдущая строка будет выглядеть так:

registerColumnType( Types.VARCHAR, 4000, "varchar2($l char)" );

Теперь генерируется правильное определение (с использованием char вместо byte), и это решает мою проблему.

...