繁体   English   中英

如何在“movie_added_by”表中添加movie_id和user_id

[英]How to add movie_id and user_id in “movie_added_by” table

我已经有一个用户 model。 现在我创建了一个电影model,我的要求是每当任何现有用户要添加任何电影时,那时user_idmovie_id将存储在movie_added_by表中。

在这里,用户model 需要将 map 一对多地映射到movie_added_by ,同样,电影将映射到movie_added_by。

为了更好的理解,可以参考DB图。

在此处输入图像描述

我真的不知道如何使用hibernate 注释

用户 model 是这样的:

@Getter
@Setter
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id", unique = true, nullable = false)
    private Integer user_id;
    
    private String name;    
} 

电影model是这样的:

@Getter
@Setter
public class Movie implements Serializable
{
    private static final long serialVersionUID = -6790693372846798580L;
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "movie_id", unique = true, nullable = false)
    private Integer movie_id;
 
    private String movie_name;
} 

您可能希望在实体之间创建 @ManyToMany 关系。 有两种方法(使用显式创建的中间表或由 Hibernate 创建的中间表。

在简单的方法中,您的实体将如下所示:

public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id", unique = true, nullable = false)
    private Integer user_id;
    
    private String name;

    @ManyToMany(cascade = CascadeType.Persist)
    @JoinTable(name="user_movie", 
    joinColumns = {@JoinColumn(name="user_id")},
    inverseJoinColumns = {@JoinColumn(name="movie_id)})
    private Set<Movie> movies = new HashSet<>();
    
} 

public class Movie implements Serializable
{
    private static final long serialVersionUID = -6790693372846798580L;
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "movie_id", unique = true, nullable = false)
    private Integer movie_id;
 
    private String movie_name;

    @ManyToMany(cascade = CascadeType.Persist, mappedBy = "movies" //field from the user class responsible for mapping)
    private Set<User> users = new HashSet<>()



} 


所以基本上在这里你告诉 Hibernate 创建一个中间表并将这两个实体的相关 ID 保留在那里。 这里还有一些其他注意事项:

a) 您可能希望将 id 变量类型从 Integer 更改为 Long 以防您的实体增长;

b) 如果你已经用@Id注解了一个列,你不必在列注解中使用unique=true和nullable=false;

c) 记住实现无参数构造函数;

d) 记得从 equals()、hashCode() 和 toString() 方法中排除关系文件;

还有另一种方法,您可以为表保持关系显式创建 model。 当事实证明您需要在“关系表”中保留更多数据时,这可能会变得很方便。 在这种情况下,您的实体将如下所示:

public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id", unique = true, nullable = false)
    private Integer user_id;
    
    private String name;

    @OnetToMany(cascade = CascadeType.PERSIST, mappedBy = "user")
    private Set<AddedMovie> addedMovies = new HashSet<>()
    
}

public class Movie implements Serializable
{
    private static final long serialVersionUID = -6790693372846798580L;
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "movie_id", unique = true, nullable = false)
    private Integer movie_id;
 
    private String movie_name;

    @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "movie")
    private Set<AddedMovie> moviesAddedByUser = new HashSet<>();

} 

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class AddedMovie{
    @Id
    @GeneratedValue
    private Long id;
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "user_id")
    private User user;
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "movie_id")
    private Movie movie;

// sine this entity has now its own lifecycle, you can add more fields here
    private Integer rating;
    private LocalDateTime movieAddedOn;
}



暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM