java - 无法保存实体“外键约束失败”
问题描述
我正在尝试将实体保存到使用 @JoinTable 注释创建的表中。
这是设置表的主要实体:
public class MachineGroup {
@Id
@GeneratedValue(strategy= GenerationType.AUTO, generator = "machine_groups_seq")
@SequenceGenerator(name = "machine_groups_seq", allocationSize = 1, initialValue = 2)
@Column(name = "id")
private long id;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "machine_groups_to_machines",
joinColumns = @JoinColumn(name = "machine_group_id"),
inverseJoinColumns = @JoinColumn(name = "machine_id"))
private Set<Machine> machines;
}
我尝试保存的实体:
@Entity
@Table(name="machine_groups_to_machines")
@Getter
@Setter
public class MachineGroupToMachine {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name = "id")
private long id;
@ManyToOne
@JoinColumn(name = "machine_id")
private Machine machine;
@ManyToOne
@JoinColumn(name = "machine_group_id")
private MachineGroup machineGroup;
public MachineGroupToMachine(Machine machine, MachineGroup machineGroup) {
this.machine = machine;
this.machineGroup = machineGroup;
}
}
现在我正在尝试通过 MachineGroupToMachineRepository 直接使用以下方法保存 MachineGroupToMachine:
public MachineGroup save(Machine machine, MachineGroup machineGroup){
Optional<MachineGroupToMachine> omgm = machineGroupToMachineRepository.findMachineGroupToMachineByMachineAndMachineGroup(machine, machineGroup);
if(omgm.isPresent()){
String names = MessageFormat.format("Machine {0} and Machine Group {1}", machine.getName(), machineGroup.getName());
throw new EntityAlreadyExistsException(names);
}
return machineGroupToMachineRepository.save(new MachineGroupToMachine(machine, machineGroup)).getMachineGroup();
}
Hibernate 尝试执行此查询:
Hibernate: insert into machine_groups_to_machines (machine_id, machine_group_id) values (?, ?)
这是一个例外:
Cannot add or update a child row: a foreign key constraint fails (`test_db`.`machine_groups_to_machines`, CONSTRAINT `FK7g1k7n6hssjrwqadtrx0pc840` FOREIGN KEY (`MACHINE_ID`) REFERENCES `machines` (`id`))
我是否以适当的方式保存实体?也许应该从其他地方完成?
解决方案
你有什么不明白的?您指的是该MachineGroupToMachine
实体中的一台机器,该机器在数据库中不存在(还没有?)。如果您还想持久化机器,那么您将不得不使用@ManyToOne(cascade = PERSIST)
机器关联,但我怀疑这是您通常想要的。所以在你坚持MachineGroupToMachine
.
推荐阅读
- c - 基于 TLS 的套接字
- javascript - 如何使用 setState 回调来更新 TextInput 的 value 属性
- node.js - 将猫鼬字段设置为字符串或数字类型
- r - 如何计算R中特定时间段之间的约会nr
- reactjs - 为什么在尝试使用返回值创建图表时出现三个错误?
- airflow - 将“snowflake-connector-python”安装到 GCP Cloud Composer 时出错
- xcode - MacOS 应用程序屏幕尺寸
- swift - 如何创建不可变的惰性属性?
- cmd - 如何终止批处理文件
- python - 即使 foreign_keys 为 ON,FOREIGN KEY 约束也会失败