2012-04-20 2 views
2

Я использую Hibernate framework 3.6.10.Final и MySql. I'am получениеHibernate MappingException при использовании аннотации @Inheritance с MySql

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

, когда я в том числе @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) в классе автомобилей. Он отлично работает с этой аннотацией.


Vehicle.java мой базовый класс:

@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; 
    } 

} 

Мой главный класс:

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(); 

    } 
} 

И когда я бегу я получаю следующее сообщение об ошибке:

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)

+1

взглянуть на этот ответ на [SO] (http://stackoverflow.com/questions/3154649/java-hibernate-jpa-inheritancetype-table-per-class-and- идентификаторы) –

ответ

8

если вы используете TABLE_PER_CLASS, вы должны использовать этот идентификатор стратегии поколения: @ GeneratedValue (стратегия = GenerationType.TABLE)

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; 
    } 

} 
Смежные вопросы