Spring JPA Postgresql-如果没有一个,则复制复合键

时间:2018-08-31 21:52:18

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

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

应用类:

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

我不确定是否相关,但是我从休眠状态使用ddl-auto: update自动创建表。

我希望你们能帮助我,加油。

1 个答案:

答案 0 :(得分:0)

@Morteza表示我的关系有误。通过本教程和其他教程,我发现了很多东西(在发布之前,我确实在Google上搜索了很多),我可以通过将@OneToMany类中的关系从@ManyToOne更改为Social Networks来修复它。这些是我所做的更改:

应用类:

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

感谢帮助人员!