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