Creating a sequence in spring boot - postgresql

I am using spring boot specifically spring data jpa for working with the database and the database manager is postgres. I need to create a sequence that will be used in the conformation of an attribute.
Specifically my attribute is called classifier (this attribute is not the primary key) and it is formed with a given string and a consecutive number (which would be the value given by the sequence) example FMFC-COMP-1234
currently I create the sequence with postgres using
CREATE SEQUENCE seq_name START WITH 1;
but I wish I could create it from spring boot. Any help will be welcome. Thanks in advance

Related

Horizontal scale up issue with Spring Data JPA Batch/bulk insert : PostgreSQL

I have implemented the Spring data JPA batch insert and it's working perfectly fine. Also I have seen very good improvement in performance.
For this implementation I have used Spring, Spring Data JPA and PostgreSQL.
If I scale up my application horizontally(like have 2 node in the cluster).The application is not working because the application in each node have same logic to generate the value of primary key.
It means, two node are generating the same primary key and trying to insert the records. As this violating primary key constraints, service is getting failed.
Is there any strategy to generate the primary key which will be unique multi-threaded environment(The application is deployed in multiple nodes)?
I have referred this
My implementation is perfectly working fine when there is only one node in cluster.
I came to know that if the entities use GenerationType.IDENTITY identifier generator, Hibernate will silently disable batch inserts/updates.
Also I have tried with "GenerationType.SEQUENCE" but have seen the same issue.On further research, I have seen some comments in stack-overflow question that since mysql/PostgreSQL doesn't support sequence
The main two algorithms that are worth to consider are HiLo which reserves a batch of ids on the db side and uses them one by one on the application side.
Or just using UUIDs which are constructed in a way that they are unique without requiring any synchronization.

syncing elasticsearch indices with postgresql table

I have an event table in PostgreSQL which is made based on the event-sourcing pattern, as you can see it here:
I want to export these data into their appropriate elasticsearch indices whenever a new row is created in the event table. I wonder what is the best approach as I'm using spring boot Rest API for my application.

Get nextvalue of sequence in postgres using JPA and not native query

I have a sequence created using flyway in postgres which should start from 10000.
I want to get the next value of the sequence using JPA and not a native query , since i have different db platforms being run at different cloud providers.
I'm not able to find a JPA query to get the next value of a sequence, please redirect me to the right page if i am missing something already ..
Thanks for any help in that area though already!
P.S : I found this link which helps me doing the same with native query.
postgresql sequence nextval in schema
I don't think this is possible in a direct way.
JPA doesn't know about sequences.
Only the implementation knows about those and utilizes them to create ids.
I see the following options to get it to work anyway:
create a view in the database with a single row and a single column containing the next value. You can query that with native SQL which should be the same for all databases since it is a trivial select.
Create a dummy entity using the sequence for id generation, save a new instance and let JPA populate the id.
A horrible workaround but pure JPA.
Bite the bullet and create a simple class that provides the correct native SQL statement to use for the current environment and execute it via JdbcTemplate.

Reset sequence in jpa

I use spring boot 2 with spring data jpa, hibernate and posgres.
I need to reset a sequence every 1 day of the year, because we use current + ''+ sequence id.
Is there a way to reset a sequence with jpa?
A pure JPA way to reset a sequence does not exist, and resetting sequences is not even supported by all databases. That being said, you could try this solution with a native query (em.createNativeQuery(...).executeUpdate()) or the stored procedure API if you absolutely must use JPA for the job.

Can Spring-JPA work with Postgres partitioning?

We have a Spring Boot project that uses Spring-JPA for data access. We have a couple of tables where we create/update rows once (or a few times, all within minutes). We don't update rows that are older than a day. These tables (like audit table) can get very large and we want to use Postgres' table partitioning features to help break up the data by month. So the main table always has this calendar month's data but if the query requires retrieval from previous months it would somehow read it from other partitions.
Two questions:
1) Is this a good idea for archiving older data but still leave it query-able?
2) Does Spring-JPA work with partitioned tables? Or do we have to figure out how to break up the query and do native queries and concatenate the restult set?
Thanks.
I am working with postgres partitioning with Hibernate & Spring JPA for a period of time. So I think, I can try to answer your questions.
1) Is this a good idea for archiving older data but still leave it query-able?
If you are applying indexes and not re-indexing table frequently, then partitioning of data may result faster query results.
Also you can use clustered index feature in postgres as well to fetch the data faster.
Because table with older data will not going to be updated, so clustered index will improve the performance efficiently.
2) Does Spring-JPA work with partitioned tables? Or do we have to figure out how to break up the query and do native queries and concatenate the restult set?
Spring JPA will work out of the box with partitioned table. It will retrieve the data from master as well as child tables and returns the concatenated result set.
Note : Issue with partitioned table
The only issue you will face with partitioned table is insertion in partitioned table.
Let me explain, when you partition a table, you will create a trigger over master table, and that trigger will return null. This is the key behind insertion issue in partitioned table using Spring JPA / Hibernate.
When you try to insert a row using Spring JPA or Hibernate you will face below issue
Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
To overcome this issue you need to override implementation of Batching batcher.
In hibernate you can provide the custom implementation of batcher factory using below configuration
hibernate.jdbc.factory_class=path.to.my.batcher.factory.implementation
In spring JPA you can achieve the same by custom implementation of batch builder using below configuration
hibernate.jdbc.batch.builder=path.to.my.batch.builder.implementation
References :
Custom Batch Builder/Batch in Spring-JPA
Demo Application
In addition to the #Anil Agrawal answer.
If you are using spring boot 2 then you need to define the customBatcher using the property.
spring.jpa.properties.hibernate.jdbc.batch.builder=net.xyz.jdbc.CustomBatchBuilder
You do not have to break down the JDBC query with postgres 11+.
If you execute select on the main table with plain jdbc, the DB would return the aggregated results from the partitioned tables.
In other words, the work is done by the Postgres DB, so Spring JPA will simply get the result and map it to objects as if there were no partitioning.
For having inserts work in a partitioned table you need to make sure that your partitions are already created, i think spring data will not create them for you.