首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在“movie_id”表中添加user_id和movie_added_by

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

Stack Overflow用户
提问于 2021-01-15 11:26:02
回答 1查看 33关注 0票数 0

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

这里,movie_added_by用户模型需要将一个映射到多个,类似地,电影将映射到movie_added_by。

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

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

用户模型如下所示:

代码语言:javascript
复制
@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;    
} 

电影模型是这样的:

代码语言:javascript
复制
@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;
} 
EN

回答 1

Stack Overflow用户

发布于 2021-01-15 11:53:23

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

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

代码语言:javascript
复制
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)记住实现非args构造函数;

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

还有一种方法,您可以显式地为表保持关系创建一个模型。当您需要在“relationship”表中保存更多数据时,这可能变得非常方便。在这种情况下,您的实体如下所示:

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65735268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档