Jor*_*ksa 14 java database orm jpa
我一整天都试图解决这个问题,但没有运气!此外,我试图阅读网络上的大多数教程,但众所周知,他们都充满了无用的例子,不能反映你在现实世界中的需求.
所以这是我的情况:
数据库:
表:车辆(vehicleId,品牌,型号,devYear,regNumber)< - vehicleId是PrimaryKey
table:extras(vehicleId,allowSmoke,allowFood,allowDrinks,airConditioner)< - vehicleId是PK和FK.
关键是如果我有一个类Vehicle和一个映射到数据库的类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( );
Run Code Online (Sandbox Code Playgroud)
任何人都知道这种一对一的案例使用什么样的注释?
Chr*_*ice 18
Java Persistence wikibook有一个名为Primary Keys through OneToOne和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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,您的某个实体需要确保它具有与另一个实体相同的ID,这在示例中由TravelExtras构造函数完成,该构造函数需要它所绑定的Vehicle.
小智 10
我知道这是非常古老的 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.
}
Run Code Online (Sandbox Code Playgroud)
应该为 VehicleExtra 表共享相同的 pk/fk