【发布时间】:2019-07-01 09:03:10
【问题描述】:
首先,如果我的英语不是最好的,我很抱歉,但我会尽力解释我的问题。
我实际上是在尝试在我的数据库中保存一个对象,但是我有一个 PSQLException 说如果不保存我的第一个对象就无法保存(外键问题)。
所以,我有一个包含 Frais 的对象 Mission。这是我的课:
@Entity
@Table(name = "T_MISSION")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Getter
@Setter
@NoArgsConstructor
public class Mission implements Serializable {
private static final long serialVersionUID = -8050548742704457221L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "t_mission_t_frais", joinColumns = {
@JoinColumn(name = "fraiss_id") }, inverseJoinColumns = {
@JoinColumn(name = "missions_id", referencedColumnName = "id") })
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<Frais> fraiss = new HashSet<>();
}
这是我的班级“Frais”:
@Entity
@Table(name = "T_FRAIS")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Getter
@Setter
@NoArgsConstructor
public class Frais implements Serializable {
private static final long serialVersionUID = -4881527916470482329L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToMany(mappedBy = "fraiss")
private Set<Mission> missions = new HashSet<>(0);
}
如您所见,当我尝试保存新任务时,我希望将我的数据保存在名为“t_mission_t_frais”的数据库表中,其中包含 fraiss_id 和missions_id。
但是现在,由于此错误,我无法保存它:' org.postgresql.util.PSQLException:错误:表“t_mission_t_frais”上的插入或更新语句违反了键约束 外国“fk_frais_mission_id” 详细信息:密钥 (missions_id) = (60261) 不存在于表“t_mission”中。'
这是我的 MissionService :
@Service
@Transactional
public class MissionService {
@Autowired
private MissionRepository missionRepository;
public void save(Mission mission) {
missionRepository.save(mission);
}
}
由于我是 Java 新手,我想我在任务类中配置错误,但我想我的任务没有先保存(在 frais 之前),这会阻止保存事务...
我已经尝试将“save”替换为“saveAndFlush”,然后做其他事情但没有得到我想要的结果...
如果你们有什么想法可以帮助我吗?
编辑:
我的任务是使用前端应用程序 (Angular) 创建的,并以 JSON 格式发送。这是一个例子:
id: 67114,
fraiss: [
{
actif: true
fraisType: {id: 44881, libelle: "Indemnité", actif: true}
actif: true
id: 44881
libelle: "Indemnité"
id: 60261
libelle: "53,50€ par nuité"
missions: []
},
{
actif: true
fraisType: {id: 136, libelle: "Frais", actif: true}
actif: true
id: 136
libelle: "Frais"
id: 23986
libelle: "54€ par jour"
missions: []
}
]
@RequestMapping(value = "/rest/manage/missions", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public void create(@RequestBody Mission mission) {
log.debug("REST request to save Mission : {}", mission);
missionService.save(mission);
}
【问题讨论】:
-
能否提供执行的 SQL 语句以及创建 Mission 和 Frais 的代码?
-
@SimonMartinelli 我的任务是通过发布请求创建的,这里是 JSON 格式的示例:id: 67114, fraiss: [ { actif: true fraisType: {id: 44881, libelle: "Indemnité ", actif: true} actif: true id: 44881 libelle: "Indemnité" id: 60261 libelle: "53,50€ par nuitée à partir du 25ème mois" 任务: [] }, { actif: true fraisType: {id: 136, libelle: "Frais", actif: true} actif: true id: 136 libelle: "Frais de route" id: 23986 libelle: "54€ par jour" 任务: [] } ] 我怎样才能看到 SQL 语句IntelliJ ?
-
您不能只保存从 JSON 获得的内容。您必须确保按照您定义的方式设置所有关系。
-
我没有放我所有的课程,因为它们很长,但是如果我有“fraiss :[]”,我可以保存它们(当我的对象不为空时,我无法保存) 在我的 JSON 中。我知道我的 JSON 很好,我很确定问题来自 JPA 的配置,但我不知道在哪里
-
好的,我得到了消息,看起来我正试图以错误的方式保存我的对象 t_mission_t_frais -> 我正在保存 (fraiss_id,missions_id) 而不是 (missions_id, fraiss_id)。切换@JoinTable(name = "t_mission_t_frais", joinColumns = { @JoinColumn(name = "fraiss_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "missions_id", referencedColumnName = "id") } )第一种方式中的missions_id和第二种方式中的fraiss_id给了我一个stakoverflow,并将它放在Frais类中也不起作用。如果我看到其他的东西,我会给你更多的细节
标签: java postgresql hibernate jpa insert-update