how to implement auto increment in jpa - java

I am about learning JPA, and I want to know how can we tel the entity manager that the primary key field is generated using the database auto increment to the table?
I am using Mysql 5.5 and Oracle Enterprise For Eclipse(OEFE)
thanks for help

If you have a a id which needs to be auto incremented then ,
#Id #GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

Related

EclipseLink #GeneratedValue(strategy = GenerationType.AUTO creates already exist id

I am developping a java application with postgresql database, I made a manual insert into a table, and now when i try to insert from the application I get the following error:
Detail: Key (id)=(1092770) already exists
I am using eclipseLink as JPA framework and the Id generation strategy is the following:
#Id
#GeneratedValue(strategy=GenerationType.AUTO)
#Column(name="ID")
protected long id = 0L;
Clearly the eclipseLink is not considering the max(Id) in the table, and creates an Id less than the current max(Id).
Is there a way to fix this please
Thanks

GeneratedValue in Postgres

I have my entity class mapped like below:
#Entity
#Audited
#Table(name="messages_locale")
public class Locale {
#Id
#GeneratedValue
#Getter #Setter //Project Lombok's annotations, equal to generated getter and setter method
private int id;
(...)
I create clean new database ,and properties:
< prop key="hibernate.hbm2ddl.auto" >create < /prop>
WHY THE HELL (Sorry, almost two days wasted on this bug) after created database, i got a sequence in my postgres db?:
CREATE SEQUENCE hibernate_sequence
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 2
CACHE 1;
ALTER TABLE hibernate_sequence
OWNER TO postgres;
I dont want to have a sequence, I want to have just auto increment auto generated values..
I think the accepted answer from Petar is not correct, or not correct any longer. The auto-increment in Postgres is handled through SERIAL pseudo type, that’s correct. However, the mapping that Petar gives will result in the following DDL generated by Hibernate 5.1:
CREATE SEQUENCE users_id_seq START 1 INCREMENT 50;
CREATE TABLE … (
id INT8 NOT NULL,
…
);
This is not using SERIAL, but a Hibernate managed sequence. It is not owned by the table and no default value has been set. Of course, DDL generation is a feature that many people do not use in production (but many take the generated code as a template).
If you hand-write your DDL and actually used SERIAL, then using GenerationType.SEQUENCE may even conflict with the database behaviour. The correct way to map Hibernate with Postgres’ preferred ID strategy is using GenerationType.IDENTITY. Incidentally, the code is also much shorter and more readable:
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
In PostgreSQL auto-increment is handled using the SERIAL pseudo type. You use this type when you execute CREATE TABLE.
Now to the point - this SERIAL pseudo type creates a sequence.
Autoincrement in PostgreSQL is handled using the created sequence. The default value of the id column becomes - nextval('your_sequence_name').
In Hibernate for an User entity:
#Id
#GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "users_seq_gen")
#SequenceGenerator(name = "users_seq_gen", sequenceName = "users_id_seq")
public Long getId() {
return id;
}
Read here:
http://www.postgresql.org/docs/8.4/static/datatype-numeric.html#DATATYPE-SERIAL
http://www.neilconway.org/docs/sequences/

Generate ID based on number of rows in table in Spring

I am developing a spring 3 MVC application. I am using hibernate as the ORM. While defining the model, i have an ID field. I want to auto generate it in such a way that its value is the current number of rows in the table + 1. How can it be done?
AUTOINCREMENT column or a sequence will do the trick. In Hibernate simply annotate id with #GeneratedValue:
#Id
#GeneratedValue(strategy=GenerationType.AUTO)
private int id;
Hibernate will automatically set the id to next available value.
See also
Hibernate Auto Increment ID

The database returned no natively generated identity value

I am using IBM DB2 V 9.1.0.356. I am using DB2 JDBC driver version 9.7.
I am using these technologies for my application.
Spring MVC, Hibernate, DB2, Websphere
In my Create Table script; ID column is generated as:
ID BIGINT GENERATED BY DEFAULT AS IDENTITY
In Java Entity class its configured as:
#Id
#GeneratedValue(strategy = GenerationType.AUTO)
#Column( name = "id", nullable = false )
When I saves and object by calling this through hibernate:
*.save(persistentObject);
Data is saved. But I got following Exception:
org.hibernate.HibernateException: The database returned no natively generated identity value
at org.hibernate.id.IdentifierGeneratorFactory.getGeneratedIdentity(IdentifierGeneratorFactory.java:90)
Note: My application is configured on two servers on different machines. From one machine I can succefully save data; but from other I got above mentioned exception.
The fact that this works on one WebSphere server and fails on another although they both connect to the same database suggests that there is an issue with the version of the JDBC driver. I would check that first.
The above Exception can also occur if the #id annotated property mapped column dose not support auto generation of id.
i.e.
#GeneratedValue(strategy = GenerationType.AUTO)
using
Use #GeneratedValue(strategy = GenerationType.IDENTITY)
might solve the problem.
Make sure that while creating your table id field should be marked as auto-increment and then use
#GeneratedValue(strategy = GenerationType.IDENTITY)
check primary key in database, if it is not auto increment then you will get this error.
enter image description here

Hibernate duplicate primary key on restart using GenerationType.TABLE

We're running into an issue where we have Event subclasses that use GenerationType.TABLE to generate the primary key, and when we restart the servers we are getting duplicate primary key errors.
We're using SQL Server and Hibernate version 3.5.1-Final.
Here's what our Hibernate annotations look like:
#Entity
#Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Event {
#Id
#GeneratedValue(strategy = GenerationType.TABLE)
private long eventID;
we don't specify the allocationSize so we're using the default value. The hibernate sequences table does increment but it seems like on restarts it's reusing already used ID's.
Try GenerationType.AUTO or SEQUENCE.
AUTO may work via hibernate magic, but SEQUENCE should create, funnily enough, a sequence in the database which it will use to get unique IDs.
Which SQL Server are you using?

Categories