我一直在努力解决这一问题,但是没有运气!我也尝试阅读网上的大多数教程,但众所周知,它们都充满了无用的示例,无法反射(reflect)您在现实世界中的需求。
所以这是我的情况:
数据库:
表格:车辆(车辆编号,品牌,型号,devYear,regNumber)
表: Extras (vehicleId,allowSmoke,allowFood,allowDrinks,airConditioner)
关键是,如果我有一个映射到数据库的 Vehicle 类和 TravelExtras 类,我希望 Vehicle 类具有一个 TravelExtras属性 travelExtras并获取和设置方法。
不幸的是,无论我尝试将数据库中的对象持久化时,我都会遇到各种错误。
这是一个例子:
EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "NaStopPU" );
EntityManager entitymanager = emfactory.createEntityManager( );
entitymanager.getTransaction( ).begin( );
TravelExtra travelExtra = new TravelExtra();
entitymanager.persist(travelExtra);
Vehicle vehicle = new Vehicle(2L, "10152487958556242", "Mazda", "626", "334343", 2005, 4);
vehicle.setTravelExtra(travelExtra);
entitymanager.persist(vehicle);
entitymanager.getTransaction().commit();
entitymanager.close( );
emfactory.close( );
有人知道这种一对一案例要使用哪种注释吗?
最佳答案
Java Persistence Wikibook的一个名为Primary Keys through OneToOne and ManyToOne Relationships的部分似乎表明您想要的东西是可能的。
如果我没看错,对于您的情况,它看起来像:
class Vehicle {
@Id
@Column(name = "EXTRAS_ID")
private long extrasId;
@OneToOne(mappedBy="vehicle", cascade=CascadeType.ALL)
private TravelExtra extras;
}
class TravelExtras {
@Id
@Column(name = "VEHICLE_ID")
private long vehicleId;
@OneToOne
@PrimaryKeyJoinColumn(name="VEHICLE_ID", referencedColumnName="EXTRAS_ID")
private Vehicle vehicle;
public TravelExtras(Vehicle vehicle) {
this.vehicleId = vehicle.getId();
this.vehicle = vehicle;
}
}
请注意,您的一个实体将需要确保与另一个实体具有相同的ID,这在示例中由TravelExtras构造函数要求将其绑定(bind)到的Vehicle来完成。