0

我正在尝试实现一对一的映射,下面是所涉及的实体:

充当复合主键的用户 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实体,是否需要显式保存?

4

0 回答 0