gpt4 book ai didi

java - JPA 禁止执行 ALTER SEQUENCE

转载 作者:行者123 更新时间:2023-11-30 05:49:33 26 4
gpt4 key购买 nike

我有一个带有 Spring Boot 应用程序的 Spring Batch,带有一个 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_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 SEQUENCE,阅读了很多相关内容,我有两种方法来解决这个问题,使用 Spring Boot 配置文件或使用 persistence.xml 配置文件。

我都试过了:config ->

    @Configuration
public class ContextConfiguration {

@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;
}
...

和坚持->

<persistence-unit name="pu_Example"
transaction-type="RESOURCE_LOCAL">

<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>

</persistence-unit>

但它仍然在执行 alter sequence 语句,我还能做什么?

一些我已经阅读过的信息:

https://issues.apache.org/jira/browse/OPENJPA-2450

https://www-01.ibm.com/support/docview.wss?uid=swg1PI05956

How does the JPA @SequenceGenerator annotation work

感谢所有阅读本文的人

最佳答案

这两个属性(persistence.xml/配置类)都工作正常,但我必须至少运行一次应用程序并具有更改序列权限,可能在第一次运行时某些 pk 在 JPA 和 DB 之间不同步,我认为是因为数据库缓存。在这种情况下,数据库是从另一个环境迁移过来的。

在使用 alter sequence 权限运行后,权限被删除,再运行几次后,我没有看到任何问题。

我发现的关于序列缓存的有用信息以及我对其他人的帮助:

关于java - JPA 禁止执行 ALTER SEQUENCE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58919702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com