我遇到了hibernate生成标识符的问题。我正在使用序列生成器生成我的标识符。数据库是Oracle 11g和hibernate 3.6.1版。
我知道hibernate中的默认allocationSize是50,因此hibernate每50次插入就会调用数据库来获取标识符。因此我将allocationSize更改为1000以减少数据库调用,如下所示:
library(forecast)
library(vars)
library(plyr)
x <- rnorm(70)
y <- rnorm(70)
dx <- cbind(x,y)
dx <- as.ts(dx)
# Forecast Accuracy
j = 12 #Forecast horizon
k = nrow(dx)-j #length of minimum training set
prediction <- data.frame()
actual <- data.frame()
for (i in j) {
trainingset <- window(dx, end = k+i-1)
testset <- window(dx, start = k-j+i+1, end = k+j)
fit <- VAR(trainingset, p = 3)
fcast <- forecast(fit, h = j)
fcastmean <- do.call('cbind', fcast[['mean']])
fcastmean <- as.data.frame(fcastmean)
prediction <- rbind(fcastmean)
actual <- rbind(as.data.frame(testset[,1]))
}
# add predictions and actual values
result <- cbind(prediction[,1], actual)
names(result) <- c("Predicted", "Actual")
result$Difference <- abs(result$Actual - result$Predicted)
但是问题很少。
首先,这是一个增强,因此我无法升级hibernate版本以使用新的序列生成器。
其次,我不能使用下面的属性,因为这会影响其他hibernate实体,我的更改不应该触及它。有什么方法可以告诉hibernate将以下属性应用于一个实体吗?
@GeneratedValue(generator = "test_gen", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "test_gen", sequenceName = "myschema.my_oracle_sequence", allocationSize = 1000)
第三,我尝试了下面的hibernate特定映射。但是,我需要在这里提供一个初始值。如果不是,它将初始值作为1并计算标识符,并且因为已经使用了标识符,我得到了一个约束异常。 我不能在这里再次提供初始值,因为代码已经在使用,并且序列的主id和nextval都已从其初始值移开。
hibernate.id.new_generator_mappings=true
第四,我无法使用我在第一个代码块中提到的代码,因为我在插入记录时随机看到UniqueConstraintViolationException,正如其他人所见。 JPA 2 @SequenceGenerator @GeneratedValue producing unique constraint violation
有了所有这些约束,我有什么办法可以增加allocationSize以提高记录插入性能。我会在一个批次中插入大约10到4千万条记录。
此致 V