如下圖,我們將實現 categroy 和 article 的一對多關係
+-----------+ | category | |-----------| +-->|id | <---+ | |title | | | |description| 1:n | |status | | | |parent_id | o---+ | +-----------+ | 1:n | | +-----------------+ +-----------------+ | | article | | feedback | | |-----------------| |-----------------| | |id |<--1:n--+ |id | | |title | | |title | | |content | | |content | | |datetime | | |datetime | | |status | | |status | +--o|category_id | +--o|article_id | +--o|member_id | +-->|member_id | | +-----------------+ | +-----------------+ | | 2007,2008,2009 | | | 2007,2008,2009 | | +-----------------+ | +-----------------+ | | 1:n +----------+ +---1:n---+ | | member | | | |----------| | +-->|id | <---+ |user | |passwd | |nickname | |status | +----------+
首先定義分類實體類
package cn.netkiller.domain; import java.util.Date; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Index; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; import org.springframework.format.annotation.DateTimeFormat; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; @Entity @Table(indexes = { @Index(name = "name", columnList = "name DESC"), @Index(name = "path", columnList = "path") }) public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", unique = true, nullable = false, insertable = true, updatable = false) public int id; public String name; public String description; public String path; @Column(columnDefinition = "enum('Enabled','Disabled') DEFAULT 'Enabled' COMMENT '狀態'") public String status; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @Column(columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間'") public Date ctime; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @Column(columnDefinition = "TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更改時間'") public Date mtime; @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.REMOVE }) @JoinColumn(name = "pid", referencedColumnName = "id") private Category categorys; @JsonIgnore @OneToMany(cascade = CascadeType.ALL, mappedBy = "category", fetch = FetchType.EAGER) private Set<Category> category; @JsonIgnore @OneToMany(cascade = CascadeType.ALL, mappedBy = "category", orphanRemoval = true) private Set<Article> article; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public Date getCtime() { return ctime; } public void setCtime(Date ctime) { this.ctime = ctime; } public Date getMtime() { return mtime; } public void setMtime(Date mtime) { this.mtime = mtime; } public Category getCategorys() { return categorys; } public void setCategorys(Category categorys) { this.categorys = categorys; } public Set<Category> getCategory() { return category; } public void setCategory(Set<Category> category) { this.category = category; } @Override public String toString() { return "Category [id=" + id + ", name=" + name + ", description=" + description + ", path=" + path + ", status=" + status + ", ctime=" + ctime + ", mtime=" + mtime + ", categorys=" + categorys + ", category=" + category + "]"; } }
定義文章實體類
package cn.netkiller.domain; import java.io.Serializable; import java.util.Date; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; import org.springframework.format.annotation.DateTimeFormat; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; @Entity @Table(name = "article") public class Article implements Serializable { private static final long serialVersionUID = 7603772682950271321L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", unique = true, nullable = false, insertable = true, updatable = false) public int id; public String title; @Column(name = "short") public String shortTitle; public String description; public String author; public int star; public String tag; public boolean share; public boolean status; public String content; @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.REMOVE }) @JoinColumn(name = "category_id", referencedColumnName = "id") private Category category; @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.REMOVE }) @JoinColumn(name = "site_id", referencedColumnName = "id") private Site site; @ManyToOne(cascade = { CascadeType.ALL }) @JoinColumn(name = "member_id", referencedColumnName = "id") private Member member; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @Column(columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間'") public Date ctime; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @Column(columnDefinition = "TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更改時間'") public Date mtime; @JsonIgnore @OneToMany(cascade = CascadeType.ALL, mappedBy = "article", fetch = FetchType.EAGER) private Set<Comment> comment; @JsonIgnore @OneToMany(cascade = CascadeType.ALL, mappedBy = "article", fetch = FetchType.EAGER) private Set<Favorites> favorites; @JsonIgnore @OneToMany(cascade = CascadeType.ALL, mappedBy = "article", orphanRemoval = true) private Set<Statistics> statistics; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Date getCtime() { return ctime; } public void setCtime(Date ctime) { this.ctime = ctime; } public String getShortTitle() { return shortTitle; } public void setShortTitle(String shortTitle) { this.shortTitle = shortTitle; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public int getStar() { return star; } public void setStar(int star) { this.star = star; } public String getTag() { return tag; } public void setTag(String tag) { this.tag = tag; } public boolean isShare() { return share; } public void setShare(boolean share) { this.share = share; } public boolean isStatus() { return status; } public void setStatus(boolean status) { this.status = status; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } public Member getMember() { return member; } public void setMember(Member member) { this.member = member; } public Set<Comment> getComment() { return comment; } public void setComment(Set<Comment> comment) { this.comment = comment; } public Set<Favorites> getFavorites() { return favorites; } public void setFavorites(Set<Favorites> favorites) { this.favorites = favorites; } public Set<Statistics> getStatistics() { return statistics; } public void setStatistics(Set<Statistics> statistics) { this.statistics = statistics; } public Site getSite() { return site; } public void setSite(Site site) { this.site = site; } public Date getMtime() { return mtime; } public void setMtime(Date mtime) { this.mtime = mtime; } @Override public String toString() { return "Article [id=" + id + ", title=" + title + ", shortTitle=" + shortTitle + ", description=" + description + ", author=" + author + ", star=" + star + ", tag=" + tag + ", share=" + share + ", status=" + status + ", content=" + content + ", category=" + category + ", site=" + site + ", member=" + member + ", ctime=" + ctime + ", mtime=" + mtime + ", comment=" + comment + ", favorites=" + favorites + ", statistics=" + statistics + "]"; } }
希望結果
CREATE TABLE `category` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '????', `description` varchar(255) DEFAULT NULL, `mtime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '????', `name` varchar(255) DEFAULT NULL, `path` varchar(255) DEFAULT NULL, `status` enum('Enabled','Disabled') DEFAULT 'Enabled' COMMENT '??', `pid` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`), KEY `path` (`path`), KEY `FKeiel7nqjxu4kmefso9tm9qcsu` (`pid`), CONSTRAINT `FKeiel7nqjxu4kmefso9tm9qcsu` FOREIGN KEY (`pid`) REFERENCES `category` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `author` varchar(255) DEFAULT NULL, `content` varchar(255) DEFAULT NULL, `ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '????', `description` varchar(255) DEFAULT NULL, `mtime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '????', `share` bit(1) NOT NULL, `short` varchar(255) DEFAULT NULL, `star` int(11) NOT NULL, `status` bit(1) NOT NULL, `tag` varchar(255) DEFAULT NULL, `title` varchar(255) DEFAULT NULL, `category_id` int(11) DEFAULT NULL, `member_id` int(11) DEFAULT NULL, `site_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `FKy5kkohbk00g0w88fi05k2hcw` (`category_id`), KEY `FK6l9vkfd5ixw8o8kph5rj1k7gu` (`member_id`), KEY `FKrxbc33rok9m4n6pnbbwb3piwf` (`site_id`), CONSTRAINT `FK6l9vkfd5ixw8o8kph5rj1k7gu` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`), CONSTRAINT `FKrxbc33rok9m4n6pnbbwb3piwf` FOREIGN KEY (`site_id`) REFERENCES `site` (`id`), CONSTRAINT `FKy5kkohbk00g0w88fi05k2hcw` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
現在我們已經將 categroy 與 article 兩張表一對多關係建立起來。