添加新实体时休眠@OneToMany异常

时间:2020-07-24 10:30:56

标签: java sql hibernate java-8

我在MySql数据库中有两个实体。首先是 Users 实体,其次是 Movies 。我设置了关系@OneToMany@ManyToOne。我的意思是,一个用户可以拥有多部电影,而几部电影可以属于一个用户。

@Data
@Entity
@Table(name = "movies", uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id"})})
public class Movies {


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "movie_name", nullable = false)
    private String name;

    @Column(name = "expirationTime")
    private DateTime expirationTime;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id", nullable = false)
    private Users userId;




@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Table(name = "user")
public class Users {
    

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "phone_number", nullable = true)
    private String phoneNumber;
    

    @Getter
    @Setter
    @OneToMany(mappedBy = "userId", cascade = CascadeType.ALL)
    @Builder.Default
    private Set<Movies> movies = new HashSet<>(0);

我可以为每个用户添加一个电影实体。当我想为该同一用户添加另一行(添加新电影)时,会收到如下异常:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '7' for key 'movies.UKno13de9csa3gf2das1j6dsa12

有人建议如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

问题是@UniqueConstraint。在对结构进行更改之前,我必须还原数据库。删除数据库中的约束没有帮助。因此,正如我建议的那样,我从代码中删除了此批注,然后让hibernate完成该工作。现在,我可以为单个用户添加多个实体。

答案 1 :(得分:0)

为什么要将零传递给集合?我怀疑这是零导致问题的原因。

private Set<Movies> movies = new HashSet<>(0);

删除零,它将起作用。

private Set<Movies> movies = new HashSet<>();

答案 2 :(得分:0)

  • 直接从数据库中删除所有表,并让hibernate重新创建表,因为您的旧约束仍然可以存在。

  • 删除movie

  • 它试图强制执行one unique条记录,只能有var serverId = client.guilds.cache.map(guild => guild.id); // getting server id var lang = "en"; // lang var config = readConfigFile(); //reading file from config yes there is JSON.parse var server = {serverId : lang}; console.log(server); config.servers = config.servers + server; config = JSON.stringify(config); saveConfigFile(config); 个用户行

答案 3 :(得分:0)

您对唯一约束的定义是错误的。拥有@UniqueConstraint(columnNames = {"user_id"})}意味着用户7只能有一个电影行。您需要添加新的约束并将其设置在ID为user_id的列上。也丢掉旧的。

ALTER TABLE movies
ADD CONSTRAINT movie_user_uq
UNIQUE (id, user_id);