Mam aplikację Spring Batch z Spring Boot z portfelem Oracle do łączenia się i otwierania JPA w celu obsługi trwałości. Mam kilka podmiotów, których klucze podstawowe są zarządzane za pomocą sekwencji w bazie danych, takich jak ten:

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

I odpowiednia adnotacja encji:

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

Z tym kodem JPA nieustannie próbuje wykonać ALTER SEQUENCE, dużo o tym czytając, mam dwa sposoby rozwiązania problemu, za pomocą pliku konfiguracyjnego Spring Boot lub pliku konfiguracyjnego persistence.xml.

Wypróbowałem oba z nich: 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;

} ...

I wytrwałość ->

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

Ale nadal wykonuje instrukcję zmiany sekwencji, co więcej mogę zrobić?

Kilka informacji, które już przeczytałem:

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

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

Java - JPA - Generatory - @SequenceGenerator

Dziękuję wszystkim, którzy to przeczytali

3
Rodrigo Doe 18 listopad 2019, 20:08
1
Czy sprawdziłeś to zalecenie?
 – 
Marmite Bomber
18 listopad 2019, 22:05
Tak, zrobiłem, ten sam wynik.
 – 
Rodrigo Doe
19 listopad 2019, 11:11

1 odpowiedź

Obie właściwości (persistence.xml / klasa konfiguracyjna) działają dobrze, ale musiałem uruchomić aplikację przynajmniej raz z uprawnieniem do zmiany sekwencji, prawdopodobnie niektóre pk nie były zsynchronizowane między JPA a DB w pierwszym uruchomieniu, jak sądzę z powodu pamięci podręcznej DB. W tym przypadku DB został przeniesiony z innego środowiska.

Po uruchomieniu z uprawnieniami do zmiany sekwencji uprawnienia zostały usunięte i po kilku kolejnych uruchomieniach nie widziałem już żadnego problemu.

Przydatne informacje, które znalazłem na temat buforowania w sekwencjach i mojej pomocy innym:

0
Rodrigo Doe 19 listopad 2019, 17:00