【问题标题】:JPA - Many to Many - Foreign key violated when create / updateJPA - 多对多 - 创建/更新时违反外键
【发布时间】: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


【解决方案1】:

问题在于我的 JPA 的配置。任务的保存方式错误:试图在我的 t_mission_t_frais (fraiss_id,missions_id) 中保存一个新值 (missions_id, fraiss_id),由于任务不存在而发生 PSQLException

在我的任务课程中,我的“JOIN TABLE”以错误的方式声明:

@ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "t_mission_t_frais",
        joinColumns = { @JoinColumn(name = "missions_id", referencedColumnName = "id") },
        inverseJoinColumns = { @JoinColumn(name = "fraiss_id", referencedColumnName = "id") })
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Frais> fraiss = new HashSet<>();

但只有这个修改是在做我的 stackoverflow,所以我也不得不修改我的 Frais 类:

@ManyToMany
@JoinTable(name = "t_mission_t_frais",
    joinColumns = { @JoinColumn(name = "missions_id", referencedColumnName = "id") },
    inverseJoinColumns = { @JoinColumn(name = "fraiss_id", referencedColumnName = "id") })
private Set<Mission> missions = new HashSet<>(0);

我现在可以保存我的对象了!感谢西蒙的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 2018-07-09
    相关资源
    最近更新 更多