我正在尝试实现一对一的映射,下面是所涉及的实体:
充当复合主键的用户 ID:
@Embeddable
public class UserID implements Serializable {
private static final long serialVersionUID = 1L;
private int ssnID;
// getters and setters...
}
车辆实体:
@Entity
public class Vehicle {
@Id
private int vehicleID;
private String description;
// getters and setters..
}
以 UserID 作为复合主键并与 Vehicle Entity 具有一对一关系的 UserInfo 实体:
@Entity
public class UserInfo {
@EmbeddedId
UserID userID; // Object which acts as a primary key (composite primary key)
private String full_name;
@OneToOne
@JoinColumn(name="VEHICLE_ID")
Vehicle veh;
// Getters and Setters...
}
UserInfo
是拥有方实体,因为它具有FK
(使用@JoinColumn)并具有UserID
复合主键。
当我保存UserInfo
对象时,下面是hibernate的sql日志:
休眠:删除表 UserInfo(如果存在)
休眠:删除表车辆(如果存在)
Hibernate: 创建表 UserInfo (ssnID integer not null, full_name varchar(255), VEHICLE_ID integer, primary key (ssnID))
Hibernate: 创建表 Vehicle (vehicleID integer not null, description varchar(255), primary key (vehicleID))
休眠:更改表 UserInfo 添加约束 FK9nx05ha53jhcue5rwks77x0mv 外键 (VEHICLE_ID) 引用车辆
在此之后,它会抛出异常:
ERROR: Referential integrity constraint violation: "FK9NX05HA53JHCUE5RWKS77X0MV: PUBLIC.USERINFO FOREIGN KEY(VEHICLE_ID) REFERENCES PUBLIC.VEHICLE(VEHICLEID) (100)"; SQL statement:
update UserInfo set full_name=?, VEHICLE_ID=? where ssnID=? [23506-190]
Caused by: org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation: "FK9NX05HA53JHCUE5RWKS77X0MV: PUBLIC.USERINFO FOREIGN KEY(VEHICLE_ID)
REFERENCES PUBLIC.VEHICLE(VEHICLEID) (100)"; SQL statement:
update UserInfo set full_name=?, VEHICLE_ID=? where ssnID=? [23506-190]
我无法理解为什么这会引发异常;我没有插入任何重复的值。
使用@OneToOne 或@JoinColumn 进行映射是否有任何问题?
谁能帮我理解这一点?
编辑:
我创建了一个辅助类来进行实际保存,部分代码片段是:
public void saveUser(UserInfo userInfo) {
Session session = null;
session = sf.openSession();
session.beginTransaction();
session.save(userInfo);
session.getTransaction().commit();
session.close();
}
所以,从 main() 我调用这个辅助方法,并保存实体UserInfo
(它有另一个实体Vehicle
集)。
请注意我没有保存Vehicle
实体,是否需要显式保存?