HHH-14211 Switch to using oid for CLOB in PostgreSQL to avoid losing data after vacuumlo
This commit is contained in:
parent
0f46ee2466
commit
e1a976bce0
|
@ -125,7 +125,7 @@ public class PostgreSQLDialect extends Dialect {
|
|||
//use oid as the blob type on Postgres because
|
||||
//the JDBC driver is rubbish
|
||||
registerColumnType( Types.BLOB, "oid" );
|
||||
registerColumnType( Types.CLOB, "text" );
|
||||
registerColumnType( Types.CLOB, "oid" );
|
||||
|
||||
//there are no nchar/nvarchar types in Postgres
|
||||
registerColumnType( Types.NCHAR, "char($l)" );
|
||||
|
|
|
@ -21,6 +21,7 @@ import org.hibernate.testing.orm.junit.RequiresDialect;
|
|||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.hibernate.testing.util.ExceptionUtil;
|
||||
import org.junit.Assert;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
@ -69,9 +70,9 @@ public class PostgreSqlLobStringTest {
|
|||
" (?, ?, ?, -1)"
|
||||
)) {
|
||||
int index = 1;
|
||||
statement.setString( index++, value1 );
|
||||
statement.setString( index++, value2 );
|
||||
statement.setString( index++, value3 );
|
||||
statement.setClob( index++, session.getLobHelper().createClob( value1 ) );
|
||||
statement.setClob( index++, session.getLobHelper().createClob( value2 ) );
|
||||
statement.setClob( index++, session.getLobHelper().createClob( value3 ) );
|
||||
|
||||
assertEquals( 1, statement.executeUpdate() );
|
||||
}
|
||||
|
@ -81,20 +82,27 @@ public class PostgreSqlLobStringTest {
|
|||
|
||||
@Test
|
||||
public void testBadClobDataSavedAsStringFails(SessionFactoryScope scope) {
|
||||
try {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
final Query query = session.createQuery( "from TestEntity" );
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
final Query query = session.createQuery( "from TestEntity" );
|
||||
|
||||
final List<TestEntity> results = query.list();
|
||||
final List<TestEntity> results = query.list();
|
||||
|
||||
fail( "Exception thrown expected" );
|
||||
} );
|
||||
}
|
||||
catch (Exception e) {
|
||||
Exception rootException = (Exception) ExceptionUtil.rootCause( e );
|
||||
assertTrue( rootException.getMessage().startsWith( "Bad value for type long" ) );
|
||||
}
|
||||
assertThat( results.size(), is( 1 ) );
|
||||
|
||||
final TestEntity testEntity = results.get( 0 );
|
||||
assertThat( testEntity.getFirstLobField(), is( value1 ) );
|
||||
assertThat( testEntity.getSecondLobField(), is( value2 ) );
|
||||
final Clob clobField = testEntity.getClobField();
|
||||
try {
|
||||
|
||||
assertThat( clobField.getSubString( 1, (int) clobField.length() ), is( value3 ) );
|
||||
}
|
||||
catch (SQLException e) {
|
||||
fail( e.getMessage() );
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -107,9 +115,9 @@ public class PostgreSqlLobStringTest {
|
|||
statement.executeUpdate(
|
||||
"update test_entity\n" +
|
||||
"set \n" +
|
||||
" clobfield = lo_from_bytea(0, cast(clobfield as bytea)),\n" +
|
||||
" firstlobfield = lo_from_bytea(0, cast(firstlobfield as bytea)),\n" +
|
||||
" secondlobfield = lo_from_bytea(0, cast(secondlobfield as bytea))"
|
||||
" clobfield = lo_from_bytea(0, lo_get(clobfield)),\n" +
|
||||
" firstlobfield = lo_from_bytea(0, lo_get(firstlobfield)),\n" +
|
||||
" secondlobfield = lo_from_bytea(0, lo_get(secondlobfield))"
|
||||
);
|
||||
}
|
||||
} );
|
||||
|
|
Loading…
Reference in New Issue