I am using hbm2ddl
in my hibernate based application to generate the db schema. The value of hibernate.hbm2ddl.auto
property is create-drop
.
I am using @Entity
annotations for my POJO classes.
@Entity
public class testTable1 {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
Long id;
}
@Entity
public class testTable2 {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
Long id;
}
However on executing the code I keep getting continuously incremental Id values. e.g. for 2 tables the Id (i.e. Prim Key) should start each with 1. But after inserting records in Table 1
, the sequence goes from next value for Table 2
. It should start again from 1 for table 2.
I tried GenerationType.SEQUENCE
& GenerationType.AUTO
. nothing works :-(
We all know the default behaviour of Hibernate when using @SequenceGenerator - it increases real database sequence by one, multiple this value by 50 (default allocationSize value) - and then uses this value as entity ID.
allocationSize. (Optional) The amount to increment by when allocating sequence numbers from the sequence.
IDENTITY: Hibernate relies on an auto-incremented database column to generate the primary key, SEQUENCE: Hibernate requests the primary key value from a database sequence, TABLE: Hibernate uses a database table to simulate a sequence.
You are using the Global sequence generator that hibernate provide by default when no generator is provided as specifed by the JPA Spec. To have a private generator you should declare a private generator with the annotation @SequenceGenerator
and set the generator
attribute of the @GeneratedValue
annotation
Extracted from javadoc
@GeneratedValue
(Optional) The name of the primary key generator to use as specified in the SequenceGenerator or TableGenerator annotation.Defaults to the id generator supplied by persistence provider.
SequenceGenerator
This annotation defines a primary key generator that may be referenced by name when a generator element is specified for the GeneratedValue annotation. A sequence generator may be specified on the entity class or on the primary key field or property. The scope of the generator name is global to the persistence unit (across all generator types).Example:
@SequenceGenerator(name="EMP_SEQ", sequenceName="private_sequence")
Hibernate recommends that new projects use hibernate.id.new_generator_mappings=true as the new generators are more efficient and closer to the JPA 2 specification semantic
Section 1.3. Properties
2.2.3. Mapping identifier properties
Complete example
@Entity
@SequenceGenerator(name="PRIVATE_SEQ", sequenceName="private_sequence")
public class test {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="PRIVATE_SEQ")
Long id;
}
@Entity
public class MyEntity2 {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="myentity2_seq")
@SequenceGenerator(name = "myentity2_seq",sequenceName = "myentity2_seq_table")
private int id;
@Column(length = 100)
private String name;
//setters & getters ...
}
In the Database, it will create myentity2_seq_table Table for maintaining ids. we can customize table creation using initialValue = 100, allocationSize = 10 in SequenceGenerator.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With