Hallo, ich nutze folgende Konstruktion:
public class PatchedOracle10gDialect extends Oracle10gDialect { /** * Returns a GUIDGenerator to used UUIDs in a string. */ @Override public Class<?> getNativeIdentifierGeneratorClass() { return GUIDGenerator.class; } }
Die Klasse GUIDGenerator holt sich die UUID korrekterweise von der Oracle-Datenbank.
Nun bekomme ich seit Hibernate 3.? beim Programmstart folgende Warnung:
Apr 4, 2011 11:43:18 AM org.hibernate.id.GUIDGenerator <init> WARNING: DEPRECATED : use org.hibernate.id.UUIDGenerator instead with custom org.hibernate.id.UUIDGenerationStrategy implementation
DEPRECATED ist schlecht, dachte ich mir, also schaue ich nach, wie ich es ersetze.
Dabei bin ich auf <property name="hibernate.id.new_generator_mappings" value="true"/> gestoßen und da unser Projekt noch nicht produktiv ist, dachte ich mir, dann mache ich es jetzt richtig.
Aber in der Klasse org.hibernate.cfg.AnnoationBinder bin ich auf folgende Methode gestoßen:
private static String generatorType(GenerationType generatorEnum, Mappings mappings) { boolean useNewGeneratorMappings = mappings.useNewGeneratorMappings(); switch ( generatorEnum ) { case IDENTITY: return "identity"; case AUTO: return useNewGeneratorMappings ? org.hibernate.id.enhanced.SequenceStyleGenerator.class.getName() : "native"; case TABLE: return useNewGeneratorMappings ? org.hibernate.id.enhanced.TableGenerator.class.getName() : MultipleHiLoPerTableGenerator.class.getName(); case SEQUENCE: return useNewGeneratorMappings ? org.hibernate.id.enhanced.SequenceStyleGenerator.class.getName() : "seqhilo"; } throw new AssertionFailure( "Unknown GeneratorType: " + generatorEnum ); }
was mich vollends verwirrt hat.
Macht hibernate.id.new_generator_mappings=true nur mit Sequence oder HiLo IdentifierGeneratoren Sinn?
Muß ich also für UUID hibernate.id.new_generator_mappings=false setzen?
Für die WARNING aus dem LOG: Soll ich da einfach den Code aus org.hibernate.id.GUIDGenerator in eine eigene UUIDGenerationStrategy kopieren?
Auszug aus GUIDGenerator: public Serializable generate(SessionImplementor session, Object obj) throws HibernateException { final String sql = session.getFactory().getDialect().getSelectGUIDString(); try { PreparedStatement st = session.getBatcher().prepareSelectStatement(sql); try { ResultSet rs = st.executeQuery(); final String result; try { rs.next(); result = rs.getString(1); } finally { rs.close(); } log.debug("GUID identifier generated: " + result); return result; } finally { session.getBatcher().closeStatement(st); } } catch (SQLException sqle) { throw JDBCExceptionHelper.convert( session.getFactory().getSQLExceptionConverter(), sqle, "could not retrieve GUID", sql ); } }
Er holt die UUID von Oracle, was meiner Ansicht nach richtig sein müßte.
Ich bin für jeden Hinweis, ob und was ich jetzt ändern sollte dankbar.
Ciao Peter Schütt
|