0

本当にこれが欲しいかどうかは100%わかりませんが、現在は良い考えのようです。

エンティティを次のように構成します。

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id = 0;

Hibernateにテーブルを生成させると、結果は次のようになります。

  id bigserial NOT NULL,
  CONSTRAINT test_pkey PRIMARY KEY (id)

次に、bigserialは、デフォルト値が次のbigintに変換されます。

nextval('test_id_seq'::regclass)

これで問題ありませんが、現在、すべてのテーブルに単一のシーケンスを使用することを検討しており、デフォルト値を次のようにしたいと考えています。

nextval('my_global_sequence'::regclass)

後でデフォルト値を手動で調整することもできますが、このようなテーブルを自動的に定義するように休止状態に指示する方法はありますか?id列(テストされていないSQL構文)に対して次のようなコードを発行する独自のcreate tablesql戦略をプッシュする方法はありますか?

id bigint NOT NULL DEFAULT = nextval('my_global_sequence'::regclass)

「hi/lo乗算割り当てサイズのキャッシュシーケンスが何であれ」戦略を避けたいので、IDENTITY戦略に固執したいことに注意してください。時々、hibernateとのIDの競合のリスクを冒さずに、pgAdminを介していくつかの手動行を挿入する必要があります。他のすべての戦略は私には魔法のように見えます(=私はそれらを理解していません)。

4

2 に答える 2

0

休止状態でこれを行う方法がわかりませんでした。私の現在のソリューションは、すべての起動時に実行する単純な古い JDBC/SQL ロジックです。これまでのところ、私はそれについてかなり満足しています。

Connection connection = DriverManager.getConnection(dbUrl, dbUser, dbPassword);

String catalog = connection.getCatalog();
String schema = "public";

DatabaseMetaData databaseMetaData = connection.getMetaData();

ResultSet tablesResultSet = databaseMetaData.getTables(catalog, schema, null, new String[] { "TABLE" });

while(tablesResultSet.next())
{
  String tableName = tablesResultSet.getString("TABLE_NAME");

  LOGGER.info("updating table: '" + tableName + "', setting global sequence");

  // update primary keys to global sequence
  {
    //        LOGGER.info("setting global sequence for '" + tableName + "'.id");

    connection.createStatement().execute("ALTER TABLE \"" + tableName + "\" ALTER COLUMN id TYPE bigint;");
    connection.createStatement().execute("ALTER TABLE \"" + tableName + "\" ALTER COLUMN id SET NOT NULL;");
    connection.createStatement().execute("ALTER TABLE \"" + tableName + "\" ALTER COLUMN id SET DEFAULT nextval('my_global_sequence'::regclass)");
  }
}
于 2013-03-05T12:29:19.843 に答える
-1

ID に注釈を使用して、使用するシーケンス ジェネレーターを決定できます。

コードを例として使用します。

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@SequenceGenerator(name="my_global_sequence")
private long id = 0;

このアノテーションを使用すると、エンティティまたはエンティティのグループごとに特定のシーケンス ジェネレーターを構成したり、どこでも同じものを使用したりすることが簡単になります。

警告は、あなたが持っているすべてのエンティティに対してその注釈を定義する必要があるということです

于 2013-03-05T10:50:09.473 に答える