我有两个表:
主题表:
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
,并同时拥有两个表:
- 主题ID作为外键与主题ID的关系级联更新和删除
- commentId作为与的commentId的外键关系级联更新和删除
实际情况是,我有一个博客发布网站,用户将在该博客上发表评论,其中每个博客主题都有一个topicId
,每个用户评论都有commentId
,现在我必须根据条件创建表:
- 每个博客主题都可以有多条评论
- 删除博客主题时,该博客主题上的所有评论都必须被删除
- 发布评论的用户稍后可以删除或编辑评论
我正在使用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
}
您可以坚持当前的模式,并且仍然能够使用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.上添加唯一索引
关于链接表场景,如果你真的有:,我会使用它
- 您的模式设计似乎是明确的单向的,Topics有注释,而注释只有一个拥有的主题。所以这将是一种逻辑缺陷
- 如果您要从评论中查询并加入主题,则需要额外的加入,这可能会降低性能
- 使用JPA获取评论的主题会有点尴尬,因为您将获得一个主题列表,然后您需要明确地获得第一个条目
- 您最终会在Topics表中使用过时/多余的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;