我一直在努力解决这一问题,但是没有运气!我也尝试阅读网上的大多数教程,但众所周知,它们都充满了无用的示例,无法反射(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来完成。

10-05 20:28