Spring JPA Postgresql - 当没有复合键时,复制键是重复的

问题描述 投票:0回答:1

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

App类:

@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在DB中手动输入这些行,它也会给我同样的错误。

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

我希望你们能帮助我,欢呼。

postgresql hibernate spring-boot jpa composite-key
1个回答
0
投票

正如@Morteza所说,我的关系是错误的。通过这个和其他教程,我发现了很多(我在发布之前我真的用了很多Goog)我通过改变@OneToMany类中@ManyToOneSocial Networks的关系来解决它。这些是我所做的改变:

App类:

@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;

谢谢你的帮助!

© www.soinside.com 2019 - 2024. All rights reserved.