2

I'am using Hibernate framework 3.6.10.Final and MySql. I'am getting

Exception in thread "main" org.hibernate.MappingException: Cannot use identity column key generation with mapping for: org.koushik.javabrains.dto.Vehicle

when am including @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) in vehicle class. It's working fine with out this annotation.


Vehicle.java is my base class:

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

public class Vehicle 
{

    @Id
    @GeneratedValue
    private int vehicleId;
    private String vehicleName;
        public int getVehicleId() {
        return vehicleId;
    }

    public void setVehicleId(int vehicleId) {
        this.vehicleId = vehicleId;
    }

    public String getVehicleName() {
        return vehicleName;
    }

    public void setVehicleName(String vehicleName) {
        this.vehicleName = vehicleName;
    }

}

TwoWheeler.java:

@Entity
public class TwoWheeler extends Vehicle {
    private String SteeringHandle;

    public String getSteeringHandle() {
        return SteeringHandle;
    }

    public void setSteeringHandle(String steeringHandle) {
        SteeringHandle = steeringHandle;
    }

}

FourWheeler.java:

@Entity
public class FourWheeler extends Vehicle {
    private String SteeringWheel;

    public String getSteeringWheel() {
        return SteeringWheel;
    }

    public void setSteeringWheel(String steeringHandle) {
        SteeringWheel = steeringHandle;
    }

}

My main class:

public class HibernateTest {
    public static void main(String[] args)
    {

        Vehicle vehicle = new Vehicle();
        vehicle.setVehicleName("audi"+(int)(Math.random() * 100) + 1);

        TwoWheeler bike = new TwoWheeler();
        bike.setVehicleName("bike");
        bike.setSteeringHandle("Bike SteeringHandle");

        FourWheeler car = new FourWheeler();
        car.setVehicleName("car");
        car.setSteeringWheel("Car SteeringHandle");

        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        session.save(vehicle);
        session.save(bike);
        session.save(car);
        session.getTransaction().commit();
        session.close();

    }
}

And when am running am getting following error:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. Exception in thread "main" org.hibernate.MappingException: Cannot use identity column key generation with mapping for: org.koushik.javabrains.dto.Vehicle at org.hibernate.persister.entity.UnionSubclassEntityPersister.(UnionSubclassEntityPersister.java:90) at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:90) at org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:286) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872) at org.koushik.hibernate.HibernateTest.main(HibernateTest.java:26)

Taz
  • 3,718
  • 2
  • 37
  • 59
OTUser
  • 3,788
  • 19
  • 69
  • 127
  • 1
    have a look at this answer at [SO](http://stackoverflow.com/questions/3154649/java-hibernate-jpa-inheritancetype-table-per-class-and-ids) – baba.kabira Apr 20 '12 at 09:21

2 Answers2

8

if you use TABLE_PER_CLASS, you have to use this ID generation strategy: @GeneratedValue(strategy = GenerationType.TABLE)

nimu_chox
  • 96
  • 1
0

Vehicle.java

@Entity
@Table(name="vehicle")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

public class Vehicle 
{

    @Id
    @GeneratedValue(strategy=GenerationType.TABLE)
    @Column(name="vehicle_id")
    private int vehicleId;
    @Column(name="vehicle_name")
    private String vehicleName;
        public int getVehicleId() {
        return vehicleId;
    }

    public void setVehicleId(int vehicleId) {
        this.vehicleId = vehicleId;
    }

    public String getVehicleName() {
        return vehicleName;
    }

    public void setVehicleName(String vehicleName) {
        this.vehicleName = vehicleName;
    }

}
Mikhail_Sam
  • 10,602
  • 11
  • 66
  • 102
Karthik Kompelli
  • 2,104
  • 1
  • 19
  • 22