我一整天都试图解决这个问题,但没有运气!此外,我试着在网上阅读大部分教程,但是你们都知道它们都充满了无用的例子,这些例子并没有反映你们在现实世界中的需求。
所以这是我的情况:
数据库:
表:车辆(vehicleId,品牌,型号,devYear,regNumber)< - vehicleId是PrimaryKey
表: extras (vehicleId,allowSmoke,allowFood,allowDrinks,airConditioner)< - vehicleId是PK和FK。
重点是,如果我有一个车辆类和一个 TravelExtras 类,它们被映射到数据库,我想要 Vehicle 类来有一个属性 TravelExtras travelExtras和get和set方法。
不幸的是,无论我尝试在数据库中持久保存对象时我都会遇到各种错误。
以下是插图:
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( );
任何人都知道在这种情况下使用哪种注释?
答案 0 :(得分:15)
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构造函数完成,该构造函数需要它所绑定的Vehicle。
答案 1 :(得分:3)
我知道这是非常古老的qs,但是为了确保您的情况的完整性 您可以拥有(jpa 2.0)
@Entity
@Data
public class Vehicle implements Serializable{
@Id
@GeneratedValue
private long vehicleId;
.. //other props
}
@Entity
@Data
public class VehicleExtras implements Serializable{
@Id
@OneToOne (cascade = CASCADE.ALL)
@MapsId
@JoinColumn(name ="vehicleId")
private Vehicle vehicle;
@Column
private boolean allowSmoke;
..// other props.
}
应该为VehicleExtra表共享相同的pk / fk
答案 2 :(得分:2)
为什么不使用 vm.customer= {};
对象?当你使用嵌入式对象时,你会得到
您希望在代码中实现逻辑分离,并使数据库符合实体 - 关系规范化规则。
考虑一对一的关系是很奇怪的,因为即使JPA / Hibernate允许它,所有数据都应存储在同一个表中,使您的模型更简单,同时还可以通过删除简化查询和提高数据库性能需要加入操作。
使用嵌入式对象时,您不必担心映射ID和奇怪的关系,因为您的ORM能够理解您只是进行代码分离,而不是要求表之间实际的一对一关系
@Embedded
class Vehicle {
@Id
@Column(name = "ID")
private long vehicleId;
@Column(name = "BRAND")
private String brand;
@Column(name = "MODEL")
private String model;
@Column(name = "DEV_YEAR")
private int devYear;
@Column(name = "REG_NUMBER")
private int regNumber;
@Embedded
private TravelExtra extras;
// Constructor, getters and setters...
}
答案 3 :(得分:1)
您可以使用Netbeans映射您的类。它会生成注释。问题可能是你的dao层。您必须以正确的方式持久保存对象。例如,没有Vehicle就无法保存travelExtra。也要注意拥有方。