hibernate@onetomany添加新实体时出现异常

9o685dep  于 2021-07-24  发布在  Java
关注(0)|答案(4)|浏览(311)

我在mysql数据库中有两个实体。首先是用户实体,其次是电影。我设置关系 @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

如何解决这个问题有什么建议吗?

iq3niunx

iq3niunx1#

直接从数据库中删除所有表,让hibernate重新创建这些表,因为旧的约束仍然存在。
拆下 uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id"}) 它试图强制执行 movie 记录只能有 one unique 用户行

ie3xauqp

ie3xauqp2#

问题是@uniqueconstraint。在结构中应用更改之前,我必须恢复db。删除db中的约束没有帮助。所以我建议从代码中删除这个注解,让hibernate来完成这项工作。现在我可以为单个用户添加多个实体。

lzfw57am

lzfw57am3#

你为什么把零传给片场?我怀疑是零导致了这个问题。

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

去掉零点,它就会工作。

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

4bbkushb4#

你对唯一约束的定义是错误的。有 @UniqueConstraint(columnNames = {"user_id"})} 意味着用户7只能有一个电影行。您需要添加新的约束并将其设置在列id、用户id上。同时删除旧的约束。

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

相关问题