• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Ron McLeod
  • Paul Clapham
  • Bear Bibeault
  • Junilu Lacar
Sheriffs:
  • Jeanne Boyarsky
  • Tim Cooke
  • Henry Wong
Saloon Keepers:
  • Tim Moores
  • Stephan van Hulst
  • Tim Holloway
  • salvin francis
  • Frits Walraven
Bartenders:
  • Scott Selikoff
  • Piet Souris
  • Carey Brown

inheritance and schema creation using JPA annotations

 
Ranch Hand
Posts: 237
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi there,

In my little project I have a hierarchy of classes:

abstract User
|
|__ Administrator extends User
|__ Instructor extends User
|__ Student extends User

The User class is annotated like so:



Notice that I specifically state:
@Id @GeneratedValue(strategy = GenerationType.AUTO)
for the id variable.

One would think that when I ran hbm2ddl to create the schema the USERS table would have set the USER_ID column to auto increment:

USER_ID bigint generated by default as identity (start with 1)

but that isn't what happened. Instead I got:

create table USERS (
USER_ID bigint not null,
...
primary key (USER_ID)
);

What's up with that?

Please advise,

Alan
 
Ranch Hand
Posts: 364
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

Originally posted by Alan Shiers:

@Id @GeneratedValue(strategy = GenerationType.AUTO)



For GenerationType.AUTO, the strategy that Hibernate chooses is database-dependent. To get a specific strategy, like IDENTITY, specify it.
[ February 01, 2007: Message edited by: Edvins Reisons ]
 
Alan Shiers
Ranch Hand
Posts: 237
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
This annotation: @Id @GeneratedValue(strategy = GenerationType.AUTO)
is the default and causes the database to use its own incrementing strategy. This I already know. This is the behaviour I want.

I would like to clarify my situation a little more with added code. Perhaps someone can spot the problem.

The User class is annotated like so:




Notice that I specifically state:
@Id @GeneratedValue(strategy = GenerationType.AUTO)
for the id variable.

One would think that when I ran hbm2ddl to create the schema the USERS table would have set the USER_ID column to auto increment like so:

USER_ID bigint generated by default as identity (start with 1)

but that isn't what happens. Instead I get:

create table USERS (
USER_ID bigint not null,
...
primary key (USER_ID)
);

I believe this has something to do with the Company class. It contains a collection of type Users, like so:




When I eliminate the Company class altogether and all references to it in the User class, then the annotation for the id variable is correctly noted in the database schema:

USER_ID bigint generated by default as identity (start with 1)

This tells me there is something strange in the relationship between the Company class and the User class.

I need the Company class and I also need the User class to have a bidirectional reference back to an instance of the Company class. The way I have it setup now, however, prevents the hbm2ddl from setting the auto increment on the id field in the User class. I don't really see what is going on here. Perhaps you do?

Alan
 
Edvins Reisons
Ranch Hand
Posts: 364
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hopefully, somebody can see it already. To help the rest of us, please reduce the number of annotations to a strict minimum, perhaps using p. 2.1.8.2 of the JPA specification as a guideline.
 
A "dutch baby" is not a baby. But this tiny ad is baby sized:
Thread Boost feature
https://coderanch.com/t/674455/Thread-Boost-feature
    Bookmark Topic Watch Topic
  • New Topic