Java 无法将元素添加到";“一对多”;关系,冬眠。
我有以下问题:我无法将新的Java 无法将元素添加到";“一对多”;关系,冬眠。,java,hibernate,one-to-many,insert-update,Java,Hibernate,One To Many,Insert Update,我有以下问题:我无法将新的汽车添加到相应的客户实体。错误如下: Duplicate entry 'test_login' for key 'UK_l4t3rudi0h7ibnjpnbvcnkcbf' 其中'test\u login'是客户的登录名 这里是客户实体的代码 public class Customer{ @Id @GeneratedValue @Column (name = "id") private int id; @Column (nam
汽车
添加到相应的客户
实体。错误如下:
Duplicate entry 'test_login' for key 'UK_l4t3rudi0h7ibnjpnbvcnkcbf'
其中'test\u login'
是客户的登录名
这里是客户
实体的代码
public class Customer{
@Id
@GeneratedValue
@Column (name = "id")
private int id;
@Column (name = "login", nullable = false, unique = true)
private String login;
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
private List<Vehicle> vehicles = new ArrayList<>();
public void addVehicle(Vehicle vehicle){
vehicle.setCustomer(this);
vehicles.add(vehicle);
}
}
@Entity
@Table(name = "vehicle")
public class Vehicle implements Serializable {
@Id
@GeneratedValue
@Column (name = "id")
private int id;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "customer_id")
private Customer customer;
}
DAO实现类:
public void addANewVehicle(Vehicle vehicle, Customer customer) {
customer.addVehicle(vehicle);
Session session = sessionFactory.openSession();
try {
session.getTransaction().begin();
session.save(customer);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
logger.error("Error occurred while adding a new car. Error stack trace: " + e.toString());
} finally {
session.close();
}
Field login设置为unique,当save customer不带主键时,hibernate将创建insert语句,Field login将重复
尝试加载客户并保存它
公共无效添加新车辆(车辆、客户){
save()用于插入新实体。您需要的是更新或合并现有实体。我理解这一点。我刚才说的是,您不应该使用save(),因为save()插入一个新客户,而您不需要。因此,请使用update()或merge()。好的,我尝试使用更新
或合并
,但我在车辆
表上得到了约束冲突错误。您认为添加车辆
是否正确实现?以及“约束冲突错误”的消息和堆栈跟踪是什么。外键约束失败(
db_name
vehicle,CONSTRAINT
fklwqsusj6iodeb0df1b554vxq`外键(customer_id
)参考customer
(id))
@Column (name = "login", nullable = false, unique = true)
private String login;
Session session = sessionFactory.openSession();
try {
session.getTransaction().begin();
Customer cust = session.get(Customer.class,customer.getId());
cust.addVehicle(vehicle);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
logger.error("Error occurred while adding a new car. Error stack trace: " + e.toString());
} finally {
session.close();
}