2

カスタムキー生成にhibernateのTableGeneratorを使用したい

final SessionImpl session = ((SessionImpl) EntityManagerUtils
            .getEntityManager("CORE").getDelegate());

TableGenerator generator = new TableGenerator();



    Properties params = new Properties(??????????);
    // params.put("identifier_normalizer", ?);

    params.put("table_name", "eflow.docs_number_generators");
    params.put("value_column_name", "tbl.GENERATOR_VALUE");
    params.put("segment_column_name", "tbl.GENERATOR_KEY");
    params.put("increment_size", "25");
    params.put("segment_value", "2011");
    generator.configure(IntegerType.INSTANCE, params, session
            .getSessionFactory().getDialect());

    Serializable id = generator.generate(session, new Object());
    System.out.println(id);

ただし、キー「identifier_normalizer」を持つオブジェクトが欠落しており、このスニペットはnullポインター例外をスローします。このオブジェクトは、ObjectNameNormalizerdbオブジェクト名を正規化するタイプであり、休止状態のローカルマッピングに格納されます。

hibernateの内部マッピングとその結果としてこのObjectNameNormalizerオブジェクトにアクセスする方法は?

実際には、取得するのがホットかどうかわからない休止状態のMappingsオブジェクトが必要になるようです。

前もって感謝します

4

1 に答える 1

1

解決策は次のとおりです。

  private String generateKey() {
    final SessionImpl session = ((SessionImpl) em.getDelegate());

    if (generator == null) {
        synchronized (TableGenerator.class) {
            if (generator == null) {
                generator = new TableGenerator();

                ObjectNameNormalizer normalizer = new ObjectNameNormalizer() {

                    @Override
                    protected boolean isUseQuotedIdentifiersGlobally() {
                        return false;
                    }

                    @Override
                    protected NamingStrategy getNamingStrategy() {
                        return new Configuration().getNamingStrategy();
                    }
                };
                Properties params = new Properties();
                params.put("identifier_normalizer", normalizer);
                params.put("table_name", "eflow.docs_num_generators");
                params.put("value_column_name", "GENERATOR_VALUE");
                params.put("segment_column_name", "GENERATOR_KEY");
                params.put("increment_size", "25");
                params.put("segment_value", "2011");
                generator.configure(IntegerType.INSTANCE, params, session
                        .getSessionFactory().getDialect());
            }
        }
    }

    Serializable id = generator.generate(session, new Object());
    return id.toString();
}
于 2012-11-07T10:25:32.187 に答える