У мене є додаток, який використовує анотації зі сплячого режиму 3.1 та JPA. У нього є кілька об’єктів з атрибутами byte [] (розміром 1 к - 200 к). Він використовує анотацію JPA @Lob, і в сплячому режимі 3.1 можна прочитати ці відмінно на всіх основних базах даних - це, схоже, приховує особливості постачальника JDBC Blob (як це слід робити).
@Entity
public class ConfigAttribute {
@Lob
public byte[] getValueBuffer() {
return m_valueBuffer;
}
}
Нам довелося перейти до 3,5, коли ми виявили, що сплячий режим 3.5 перериває (і не виправить) цю комбінацію приміток у postgresql (без вирішення проблеми). Я поки не знайшов чіткого виправлення, але я помітив, що якщо я просто видаляю @Lob, він використовує bytea типу postgresql (який працює, але тільки на postgres).
annotation postgres oracle works on
-------------------------------------------------------------
byte[] + @Lob oid blob oracle
byte[] bytea raw(255) postgresql
byte[] + @Type(PBA) oid blob oracle
byte[] + @Type(BT) bytea blob postgresql
once you use @Type, @Lob seems to not be relevant
note: oracle seems to have deprecated the "raw" type since 8i.
Я шукаю спосіб створити один анотований клас (із властивістю blob), який переноситься через основні бази даних.
- Який портативний спосіб анотувати властивість байт []?
- Це зафіксовано в останній версії сплячки?
Оновлення: Прочитавши цей блог, я нарешті з’ясував, що було оригінальним вирішенням проблеми JIRA: Мабуть, ви повинні скинути @Lob та анотувати властивість як:
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
byte[] getValueBuffer() {...
Однак це не працює для мене - я все одно отримую OID замість bytea; Однак це все-таки спрацювало з автором випуску JIRA, який, схоже, хотів висловитись.
Після відповіді А. Гарсіа я спробував це комбо, яке насправді працює на postgresql, але не на oracle.
@Type(type="org.hibernate.type.BinaryType")
byte[] getValueBuffer() {...
Що мені дійсно потрібно зробити, це контролювати, який @ org.hibernate.annotations.Введіть комбінацію (@Lob + байт [] отримує відображення) на (на postgresql).
Ось фрагмент від 3.5.5. Фінал від MaterializedBlobType (sql типу Blob). Згідно з блогом Стіва, postgresql хоче, щоб ви використовували потоки для bytea (не запитуйте мене чому) і спеціальний тип Blob для oid для postgresql. Зауважте також, що використання setBytes () на JDBC також призначене для bytea (з минулого досвіду). Таким чином, це пояснює, чому use-потоки не впливають, вони обидва вважають "bytea".
public void set(PreparedStatement st, Object value, int index) {
byte[] internalValue = toInternalFormat( value );
if ( Environment.useStreamsForBinary() ) {
// use streams = true
st.setBinaryStream( index,
new ByteArrayInputStream( internalValue ), internalValue.length );
}
else {
// use streams = false
st.setBytes( index, internalValue );
}
}
Це призводить до:
ERROR: column "signature" is of type oid but expression is of type bytea
Оновлення Наступне логічне запитання: "чому не просто змінити визначення таблиці вручну на bytea" і зберегти (@Lob + байт [])? Це робить роботу, ПОКИ ви намагаєтеся зберегти нульові байти []. На думку драйвера postgreSQL, це вираз типу OID, а тип стовпця - bytea - це тому, що сплячий (справедливо) викликає JDBC.setNull () замість JDBC.setBytes (null), якого очікує драйвер PG.
ERROR: column "signature" is of type bytea but expression is of type oid
Система типу в сплячому режимі в даний час є "незавершеною роботою" (відповідно до 3.5.5 коментаря до депресії). Насправді стільки коду 3.5.5 застаріло, що важко знати, на що слід звертати увагу, підкласифікуючи PostgreSQLDialect).
AFAKT, Types.BLOB / 'oid' на postgresql слід відобразити до деякого спеціального типу, який використовує JDBC-стиль стилю OID (тобто об'єкт PostgresqlBlobType та NOT MaterializedBlobType). Я ніколи фактично не використовував Blobs з postgresql, але я знаю, що bytea просто просто працює як я / я б очікував.
Зараз я переглядаю BatchUpdateException - можливо, що драйвер не підтримує пакетну групування.
Відмінна цитата з 2004 року: "Підводячи підсумки моїх сутичок, я б сказав, що нам слід почекати, коли драйвер JDBC зробить LOBs належним чином перед тим, як змінити сплячий режим".
Список літератури:
- https://forum.hibernate.org/viewtopic.php?p=2393203
- https://forum.hibernate.org/viewtopic.php?p=2435174
- http://hibernate.atlassian.net/browse/HHH-4617
- http://postgresql.1045698.n5.nabble.com/Migration-to-Hibernate-3-5-final-td2175339.html
- https://jira.springframework.org/browse/SPR-2318
- https://forums.hibernate.org/viewtopic.php?p=2203382&sid=b526a17d9cf60a80f13d40cf8082aafd
- http://virgo47.wordpress.com/2008/06/13/jpa-postgresql-and-bytea-vs-oid-type/