我想在主鍵中嵌入日期資訊,用于將在 PostgreSQL 資料庫中磁區(每月)的表。從理論上講,這應該加快找出在哪個磁區中查找資料的程序。我按照這篇文章將日期中的日期嵌入到連續劇中。現在,我面臨的問題是我無法獲得 Hibernate 使用的 Id。
cf應該給出嘗試方法的想法的sql。
CREATE SEQUENCE test_serial START 1;
CREATE OR REPLACE FUNCTION gen_test_key() RETURNS BIGINT AS $$
DECLARE
new_id bigint;
BEGIN
new_id = (nextval('public.test_serial'::regclass)::bigint % 10000000000000::bigint
( (EXTRACT(year from now())-2000)::bigint * 10000::bigint
EXTRACT(month from now())::bigint * 100::bigint
EXTRACT(day from now())::bigint
)::bigint * 10000000000000::bigint
)::bigint;
RETURN new_id;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE test
( id bigint primary key default gen_test_key(),
something text,
tstamp timestamp default now()
) PARTITION BY RANGE (id);
CREATE TABLE test_2022_10 PARTITION OF test
FOR VALUES FROM (2210100000000000000::bigint ) TO (2211010000000000000::bigint);
我遇到了一個類似的問題,建議使用存盤程序。不幸的是,表定義中只允許默認函式,因此存盤程序,接縫不適用于我。
uj5u.com熱心網友回復:
我認為您在這里需要的是SequenceStyleGenerator覆寫determineBulkInsertionIdentifierGenerationSelectFragment運行此函式代碼的子型別。您應該能夠使用@GenericGenerator. 我理解當您不想更改現有查詢時使用此概念的愿望,但您確定磁區會在您的用例中幫助您嗎?
此外,請注意不要依賴主鍵中的日期資訊,因為使用池化優化器,可能會在實際用作行的主鍵之前生成值。
uj5u.com熱心網友回復:
所以這是一個最終解決的解決方案,正如@ChristianBeikov 建議的那樣,帶有注釋的物體指向CustomIdGenerator.
public class Test {
@Id
@GenericGenerator(name = "CustomIdGenerator", strategy = "nl.test.components.CustomIdGenerator")
@GeneratedValue(generator = "CustomIdGenerator")
private Long id;
private String something;
private OffsetDateTime tstamp;
}
正如@Mr_Thorynque 所解釋的,同樣可以將存盤函式呼叫為程序。只需替換"CALL gen_test_key()"為"SELECT gen_test_key()"并且不要將其傳遞給存盤程序的錯誤方法connection.prepareCall(CALL_STORE_PROC);,而是connection.prepareStatement(STORED_FUNCTION);這樣,這就是CustomIdGenerator.
public class CustomIdGenerator implements IdentifierGenerator {
private static final String STORED_FUNCTION = "select gen_test_key()";
@Override
public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
Long result = null;
try {
Connection connection = session.connection();
PreparedStatement pstmt = connection.prepareStatement(STORED_FUNCTION);
ResultSet resultSet = pstmt.executeQuery();
if (resultSet.next()) {
result = resultSet.getLong(1);
System.out.println("Generated Id: " result);
}
} catch (SQLException sqlException) {
throw new HibernateException(sqlException);
}
return result;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/518046.html
上一篇:根據索引/變數更改小部件的顏色
