The problem here is that you mix "table-per-class" inheritance and GenerationType.Auto
.
Consider an identity column in MsSQL. It is column based. In a "table-per-class" strategy you use one table per class and each one has an ID.
Try:
@GeneratedValue(strategy = GenerationType.TABLE)
I wonder if this is a database dialect specific problem, since watching a youtube tutorial with PostgreSQL as the underlying database I saw that the creator of the video run succefully an app with the default @GeneratedValue. In my case (the underlying database is MySQL) I had to modify the @GeneratedValue strategy to GenerationType.TABLE exactly as zoidbeck proposes.
Here is the video : https://www.youtube.com/watch?v=qIdM4KQOtH8
Agree with zoidbeck's answer. You need to change strategy to:
@GeneratedValue(strategy = GenerationType.TABLE)
But that's not all, you need to create a new table, what will hold your abstract's table primary key sequence. Modify your mapping to
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "ConfirmationCodeGenerator")
@TableGenerator(table = "SEQUENCES", name = "ConfirmationCodeGenerator")
public long getConfirmationCode() {
return confirmationCode;
}
And a new table in database should look like following:
When you ran your application, Hibernate will insert a row where sequence_name
will be the entity name (SuperClass
in this example) and sequence_next_hi_value
value will be automatically incremented and used for new records of all implementing subclasses's tables.
you can use @MappedSuperclass for inheritance
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