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)

也许我以后可以去手动调整默认值,但是你有什么想法我可以告诉hibernate自动定义这样的表吗?是否有一种方法可以推送我自己的创建表 sql 策略,该策略会为 id 列发出这样的代码(未经测试的 SQL 语法):

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

请注意,我想坚持使用 IDENTITY 策略,因为我想避免任何“hi/lo 乘以分配大小缓存序列”的策略。有时我需要通过 pgAdmin 插入一些手动行,而不会冒与休眠发生任何 id 冲突的风险。所有其他策略对我来说似乎都是魔法(= 我不明白它们)。

4

2 回答 2

0

我不知道如何用hibernate做到这一点。我当前的解决方案只是一个简单的旧 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 回答