2016-09-20 43 views
0

我有不同的子实体的2个集在拥有实体鉴别子实体:@OneToMany为什么不收藏

我希望这两个集合由相应的子类的实例来填充(2个大灯和4轮):

@Test 
public void testCar() { 
    Car car = new Car(); 
    car.setId(1l); 

    Headlight light1 = new Headlight(); 
    light1.setId(1l); 
    light1.setManufacturer("Osram"); 
    light1.setPower(12); 
    light1.setOwner(car); 

    Headlight light2 = new Headlight(); 
    light2.setId(2l); 
    light2.setManufacturer("Osram"); 
    light2.setPower(12); 
    light2.setOwner(car); 

    car.getHeadlights().add(light1); 
    car.getHeadlights().add(light2); 

    Wheel wheel1 = new Wheel(); 
    wheel1.setId(3l); 
    wheel1.setManufacturer("Bridgestone"); 
    wheel1.setSize(16); 
    wheel1.setOwner(car); 

    Wheel wheel2 = new Wheel(); 
    wheel2.setId(4l); 
    wheel2.setManufacturer("Bridgestone"); 
    wheel2.setSize(16); 
    wheel2.setOwner(car); 

    Wheel wheel3 = new Wheel(); 
    wheel3.setId(5l); 
    wheel3.setManufacturer("Bridgestone"); 
    wheel3.setSize(16); 
    wheel3.setOwner(car); 

    Wheel wheel4 = new Wheel(); 
    wheel4.setId(6l); 
    wheel4.setManufacturer("Bridgestone"); 
    wheel4.setSize(16); 
    wheel4.setOwner(car); 

    car.getWheels().add(wheel1); 
    car.getWheels().add(wheel2); 
    car.getWheels().add(wheel3); 
    car.getWheels().add(wheel4); 

    entityManager.persist(car); 

    entityManager.flush(); 
    entityManager.clear(); 

    Car restoredCar = entityManager.find(Car.class, 1l); 

    Assert.assertEquals(2, restoredCar.getHeadlights().size()); 
    Assert.assertEquals(4, restoredCar.getWheels().size()); 
} 

相反,第一集合包含6个头灯(部分填充)以及第二集合包含不正确的数据:

org.hibernate.WrongClassException: Object with id: 1 was not of the specified subclass: com.commerzbank.tr.nonotc.repository.Wheel (loaded object was of wrong class class com.commerzbank.tr.nonotc.repository.Headlight) 

输出SQL:

SELECT headlights0_.owner_id AS owner6_3_1_, 
headlights0_.id   AS id2_7_1_, 
headlights0_.id   AS id2_7_0_, 
headlights0_.manufacturer AS manufact3_7_0_, 
headlights0_.owner_id  AS owner6_7_0_, 
headlights0_.power   AS power4_7_0_ 
FROM part headlights0_ 
WHERE headlights0_.owner_id=? 

我预计鉴别列纳入WHERE子句,以及:

AND headlights0_.type = 'HEADLIGHT' 

,但它不存在。

我只能固定使用Hibernate @Where这个问题(第=“类型=‘车轮’)注释。

为什么没有在这种情况下,正确的Hibernate的工作?我期望它拥有所有必要的元数据信息能够发出正确的SQL

+1

我有一个和你一样的关系,并且我使用的JPA提供程序(DataNucleus JPA)确实将鉴别符添加到集合字段的SELECT中,因此它都可以工作(没有非JPA注释)。尽管JPA规范没有明确地处理共享关系(“owner”字段在2个mappedBy中被重用),但这是一个完全合理的事情。可能会在您的JPA提供商中引发问题?我也认为你不需要在@ @ OneToMany上指定“targetEntity”,因为泛型赋予它。 –

回答