如何在两个表mysql之间建立关系

时间:2017-01-21 10:43:34

标签: java mysql spring spring-boot spring-data-jpa

我有两张桌子:

主题表:

CREATE TABLE `topics` (
  `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `topicId` varchar(45) NOT NULL,
  `title` text NOT NULL,
  `details` text,
  `dayPosted` varchar(45) DEFAULT NULL,
  `username` varchar(45) DEFAULT NULL,
  `userImage` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8;

评论表:

CREATE TABLE `comments` (
  `commentId` int(11) NOT NULL,
  `topicId` varchar(45) NOT NULL,
  `comments` text,
  `commentDate` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`commentId`),
  KEY `topicId_idx` (`topicId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

topicId列在两个表中都很常见,我想在两个表之间创建关系。问题是topicId不是主键(我可以使它成为唯一的)

或者我创建第三个表格,如topics_comments并同时拥有:

  1. topicId作为主题中topicId的外键关系 级联更新和删除
  2. commentId作为评论中的commentId的外键关系 级联更新和删除
  3. 实际情况是我有博客发布网站,用户将在该博客上发表评论,其中每个博客主题都有topicId,每个用户评论都有commentId,现在我根据条件创建了表: / p>

    1. 每个博客主题都可以有多个评论
    2. 删除博客主题时,该博客主题的所有评论都必须 被删除
    3. 发布评论的用户以后可以删除或编辑评论
    4. 我正在使用mysql与 spring boot spring jpa

      实体类:

      @Entity
      @Table(name = "topics")
      public class TopicBean implements Serializable {
      
          @Id
          @Column(name = "id")
          @GeneratedValue(strategy = GenerationType.AUTO)
          private Long id;
          @Column(name = "topicId")
          private String topicId;
          @Column(name = "title")
          private String title;
          @Column(name = "details")
          private String details;
          @Column(name = "username")
          private String username;
          @Column(name = "userImage")
          private String userImage;
          @Column(name = "dayPosted")
          private String dayPosted;
      
      //Getters and setters
      }
      

1 个答案:

答案 0 :(得分:0)

您可以坚持使用当前架构,并且仍然可以使用JPA定义工作映射。这是在当地环境中为我工作的设置(这里只有重要的部分):

<强>主题

@Entity
@Table(name = "topics")
public class Topic implements Serializable {

    @Id
    @Column(name = "id")
    private Integer id;

    @Column(name = "topicId")
    private Integer topicId;

    @OneToMany(mappedBy = "topic", cascade = {CascadeType.REMOVE, CascadeType.MERGE})
    private List<Comment> comments;

<强>评论

@Entity
@Table(name = "comments")
public class Comment implements Serializable{

    @Id
    @Column(name = "commentId")
    private Integer commentId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "topicId", referencedColumnName = "topicId")
    private Topic topic;

请记住在TOPICS.topicsId上添加唯一索引。

关于链接表方案,如果您确实如此,我会使用它:

  • 您的架构设计似乎是明确单向的,其中主题有评论,而评论只有一个拥有主题。所以这将是一个逻辑上的缺陷。
  • 如果您要查看评论并加入主题,则需要额外加入,这可能会降低效果
  • 使用JPA获取评论主题会有点尴尬,因为您将获得一个主题列表,然后您需要明确获取第一个条目。
  • 您最终会在主题表中找到过时/冗余的topicId列。

加号当然是你要正确加入,即使用主键,所以决定取决于你。以下是映射:

<强>主题

@Entity
@Table(name = "topics")
public class Topic implements Serializable {

    @Id
    @Column(name = "id")
    private Integer id;

     @ManyToMany
     @JoinTable(name="COMMON",
        joinColumns=@JoinColumn(name="TOPIC_ID"),
        inverseJoinColumns=@JoinColumn(name="COMMENT_ID"))
    private List<Comment> comments;

<强>评论

@Entity
@Table(name = "comments")
public class Comment implements Serializable{

    @Id
    @Column(name = "commentId")
    private Integer commentId;

    @ManyToMany
     @JoinTable(name="COMMON",
        joinColumns=@JoinColumn(name="COMMENT_ID"),
        inverseJoinColumns=@JoinColumn(name="TOPIC_ID"))
    private Topic topic;