【问题标题】:Spring JPA Postgresql - Composite keys are duplicated when one is notSpring JPA Postgresql - 复合键在不重复时重复
【发布时间】:2019-02-06 22:19:15
【问题描述】:

我遇到了一些麻烦,希望你能帮助我,我有以下实体:

应用类:

@Entity
@Table(name = "apps")
public class App {
    @Id
    @Column(length = 15)
    private String name;

    @Column(length = 40)
    private String web;

    @Column(length = 50)
    private String mailDomain;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "app")
    private List<SocialNetwork> socialNetworks = new ArrayList<>();

//getters, setters, equals and hash

社交网络类:

@Entity
@Table(name = "social_networks")
@IdClass(SocialNetworkCompositeKey.class)
public class SocialNetwork {
    @Id
    @Column(length = 15)
    private String name;

    @Id
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "app")
    private App app;

    @Column(nullable = false, length = 40)
    private String url;

//getters, setters, equals and hash

SocialNetworkCompositeKey 类:

public class SocialNetworkCompositeKey implements Serializable {
    private String name;
    private String app;

//equals and hash

现在每当我尝试在我的程序中或直接在数据库中插入应用程序时,我都会收到异常:

Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "uk_590itpuvpqppd9f0g2w5y8bml"
  Detail: Key (app)=(Uli App) already exists.

这在尝试插入 2 条记录时:

        app       name     url
----+---------+-----------+---------
  1 | Uli App | Twitter   | http...
----+---------+-----------+---------  
  2 | Uli App |  Linkedin | http...
----+---------+-----------+---------

我正在使用最新版本的 Spring boot 和 JPA。所以我使用JpaRepository 作为我的存储库。即使我尝试使用 pgAdmin 在数据库中手动输入这些行,它也会给我同样的错误。

我不确定它是否相关,但我使用 hibernate 中的 ddl-auto: update 来自动创建表。

希望你们能帮助我,干杯。

【问题讨论】:

  • AppSocialNetwork之间的关系不对。
  • @MortezaJalambadani 想说的是:你只有 @JoinColumn(name = "app") 但 SocialNetwork 有一个复合键,所以你应该有两个 JoinColumns
  • 嗨@SimonMartinelli,为名称添加JoinColumn 不起作用并给出了同样的问题,名称也是社交网络中的一个字段,而不是另一个表作为“应用程序”的PK

标签: postgresql hibernate spring-boot jpa composite-key


【解决方案1】:

正如@Morteza 所说,我的关系是错误的。通过这个和其他教程,我在挖掘了很多之后发现(我在发布这个之前真的用谷歌搜索了很多)我能够通过在Social Networks 类中将关系从@OneToMany 更改为@ManyToOne 来修复它。这些是我所做的更改:

应用类:

@OneToMany(mappedBy = "app", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<SocialNetwork> socialNetworks = new ArrayList<>();

社交网络类:

@Id
@ManyToOne(fetch = FetchType.LAZY)
private App app;

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 2011-09-21
    • 2015-01-24
    • 1970-01-01
    • 2016-10-25
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2019-05-06
    相关资源
    最近更新 更多