Hibernate MappingException при использовании аннотации @Inheritance с MySql

Я использую структуру Hibernate 3.6.10.Final и MySql. Я осознаю

Исключение в потоке «основной» org.hibernate.MappingException: невозможно использовать генерацию ключа столбца идентификаторов с сопоставлением для: 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: не удалось загрузить класс «org.slf4j.impl.StaticLoggerBinder». SLF4J: по умолчанию используется реализация регистратора без операций (NOP) SLF4J: см. http://www.slf4j.org/codes.html#StaticLoggerBinder для получения дополнительной информации. Исключение в потоке «основной» org.hibernate.MappingException: невозможно использовать генерацию ключа столбца идентификаторов с сопоставлением для: org.koushik.javabrains.dto.Vehicle в org.hibernate.persister.entity.UnionSubclassEntityPersister.(UnionSubclassEntityPersister.java:90) в org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:90) в org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:286) в org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872) в org.koushik.hibernate.HibernateTest.main(HibernateTest.java:26)


person RanPaul    schedule 20.04.2012    source источник
comment
взгляните на этот ответ в SO   -  person baba.kabira    schedule 20.04.2012


Ответы (2)


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

person nimu_chox    schedule 07.05.2012

Автомобиль.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;
    }

}
person Karthik Kompelli    schedule 30.06.2016