Java JPA禁用ALTER序列的执行
我有一个SpringBatch和SpringBoot应用程序,它带有一个Oracle钱包,用于连接和打开JPA以处理持久性。我有一些实体,它们的主键是通过数据库中的序列管理的,例如:Java JPA禁用ALTER序列的执行,java,oracle,spring-boot,jpa,spring-batch,Java,Oracle,Spring Boot,Jpa,Spring Batch,我有一个SpringBatch和SpringBoot应用程序,它带有一个Oracle钱包,用于连接和打开JPA以处理持久性。我有一些实体,它们的主键是通过数据库中的序列管理的,例如: CREATED 11/11/11 LAST_DDL_TIME 11/11/11 SEQUENCE_OWNER EXAMPLE SEQUENCE_NAME EXAMPLE_SEQ MIN_VALUE 1 MAX_VALUE 9999999999999999999999999999 INCREMENT
CREATED 11/11/11
LAST_DDL_TIME 11/11/11
SEQUENCE_OWNER EXAMPLE
SEQUENCE_NAME EXAMPLE_SEQ
MIN_VALUE 1
MAX_VALUE 9999999999999999999999999999
INCREMENT_BY 1
CYCLE_FLAG N
ORDER_FLAG N
CACHE_SIZE 20
LAST_NUMBER 1111
以及相应的实体名称:
@Id
@SequenceGenerator(name="seq_examples", sequenceName="EXAMPLE_SEQ", allocationSize = 1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_examples")
@Column (name="ID_EXAMPLE", nullable=false)
private Integer id_example;
有了这段代码,JPA不断地尝试执行ALTER序列,读了很多关于这方面的内容,我有两种方法来解决这个问题,一种是Spring引导配置文件,另一种是persistence.xml配置文件
我已经尝试了这两种方法:config->
@配置
公共类上下文配置{
@Bean(name="springtest_entitymanager")
public LocalContainerEntityManagerFactoryBean getEntityManagerFactoryBean(
@Qualifier("vendorAdapter") JpaVendorAdapter jpaVendorAdapter,
@Value("${${enviroment}.databaseSchema}") String databaseSchema,
@Qualifier("datasourceWalletExampleDB") DataSource dataSource,
//@Value("${ConnectionFactoryProperties}") String ConnectionFactoryProperties,
@Value("${${enviroment}.openjpa.ConnectionFactoryProperties}") String
ConnectionFactoryProperties,
@Value("${${enviroment}.openjpa.log}") String logLevel
){
Map<String, String> jpaProperties = new HashMap<String, String>();
jpaProperties.put("openjpa.jdbc.Schema", databaseSchema);
jpaProperties.put("openjpa.Log", logLevel);
jpaProperties.put("openjpa.ConnectionFactoryProperties", ConnectionFactoryProperties);
jpaProperties.put("openjpa.jdbc.DBDictionary.disableAlterSequenceIncrementBy", "true");
//debug only
//jpaProperties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new
LocalContainerEntityManagerFactoryBean();
localContainerEntityManagerFactoryBean.setPersistenceUnitName("pu_Example");
localContainerEntityManagerFactoryBean.setDataSource(dataSource);
localContainerEntityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter);
localContainerEntityManagerFactoryBean.setJpaPropertyMap(jpaProperties);
return localContainerEntityManagerFactoryBean;
@Bean(name=“springtest\u entitymanager”)
public LocalContainerEntityManagerFactoryBean getEntityManagerFactoryBean(
@限定符(“供应商适配器”)JpaVendorAdapter JpaVendorAdapter,
@值(“${${Environment}.databaseSchema}”)字符串databaseSchema,
@限定符(“datasourceWalletExampleDB”)数据源数据源,
//@值(“${ConnectionFactoryProperties}”)字符串ConnectionFactoryProperties,
@值(“${${Environment}.openjpa.ConnectionFactoryProperties}”)字符串
ConnectionFactoryProperties,
@值(“${${Environment}.openjpa.log}”)字符串日志级别
){
Map jpaProperties=newhashmap();
jpaProperties.put(“openjpa.jdbc.Schema”,databaseSchema);
jpaProperties.put(“openjpa.Log”,logLevel);
jpaProperties.put(“openjpa.ConnectionFactoryProperties”,ConnectionFactoryProperties);
put(“openjpa.jdbc.DBDictionary.disableAlterSequenceIncrementBy”,“true”);
//仅调试
//jpaProperties.put(“openjpa.jdbc.SynchronizeMappings”,“buildSchema(ForeignKeys=true)”;
LocalContainerEntityManagerFactoryBean LocalContainerEntityManagerFactoryBean=新建
LocalContainerEntityManagerFactoryBean();
localContainerEntityManagerFactoryBean.setPersistenceUnitName(“pu_示例”);
localContainerEntityManagerFactoryBean.setDataSource(dataSource);
localContainerEntityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter);
localContainerEntityManagerFactoryBean.setJPapPropertyMap(JPapProperties);
返回localContainerEntityManagerFactoryBean;
}
和持久性->
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>exampleapp.dao.model.Example</class>
<properties>
<property name="openjpa.Log" value="DefaultLevel=ERROR" />
<property name="openjpa.ConnectionFactoryProperties" value="PrettyPrint=true,
PrettyPrintLineLength=72" />
<property name="openjpa.jdbc.Schema" value="EXAMPLE" />
<property name="openjpa.jdbc.DBDictionary" value="DisableAlterSeqenceIncrementBy=true" />
</properties>
org.apache.openjpa.persistence.PersistenceProviderImpl
exampleapp.dao.model.Example
但是它仍然在执行ALTERSEQUENCE语句,我还能做什么呢
我已经读过的一些信息:
感谢阅读本文的所有人,这两个属性(persistence.xml/configuration class)工作正常,但我必须使用alter sequence权限运行应用程序至少一次,可能在第一次运行时JPA和DB之间的某些pk不同步,我认为是因为DB缓存。在这种情况下,DB是从另一个环境迁移的
在使用alter sequence特权运行之后,特权被删除,在再运行几次之后,我没有看到任何问题
我在序列缓存中找到的有用信息以及我的帮助他人: