hibernate中一对多的关系模式的设计
注解应该交由多的一方维护和管理。
例如:bbs的模块设计
三个表 版块表(category) 、主题帖表(topic)和回帖表(msg)
他们之间的对应关系是:一个版块对应多个主题帖,一个主题帖有多个回复贴。
以下是对应的建表语句。
CREATE TABLE `category` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) default NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;
CREATE TABLE `topic` ( `id` int(11) NOT NULL auto_increment, `createDate` datetime default NULL, `title` varchar(255) default NULL, `category_id` int(11) default NULL, PRIMARY KEY (`id`), KEY `FK_jqmw7lsw6i6lrdnw07c1id1nt` (`category_id`), CONSTRAINT `FK_jqmw7lsw6i6lrdnw07c1id1nt` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;
CREATE TABLE `msg` ( `id` int(11) NOT NULL auto_increment, `cont` varchar(255) default NULL, `topic_id` int(11) default NULL, PRIMARY KEY (`id`), KEY `FK_87qfcl8orshwjlllfik5deys5` (`topic_id`), CONSTRAINT `FK_87qfcl8orshwjlllfik5deys5` FOREIGN KEY (`topic_id`) REFERENCES `topic` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;那么在对象模型中是如何设计的呢?
实际过程中是通过hibernate的逆向工程生成类
import java.util.Date; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; //bbs版块下的主题 多个主题对应一个版块 @Entity public class Topic { private int id; private String title; private Category category; //private Category category2; private Date createDate; public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } @ManyToOne(fetch=FetchType.LAZY) public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } @Id @GeneratedValue 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; } }
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; //bbs的版块 @Entity public class Category { private int id; private String name; @Id @GeneratedValue 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; } }
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; //bbs主题下面的回帖 多个回帖位于一个主题帖之下 @Entity public class Msg { private int id; private String cont; private Topic topic; @ManyToOne public Topic getTopic() { return topic; } public void setTopic(Topic topic) { this.topic = topic; } @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCont() { return cont; } public void setCont(String cont) { this.cont = cont; } }关于注解的几个注意点:
1.当表名和类名不同,对表名进行配置
@Entity
@Table(name="_teacher")
public class Teacher {
}
2.当字段名和属性名不同时,对属性名进行配置
@Column(name="_name")
public String getName() {
return name;
}
3.manytoone注解交由多的哪一方维护和管理4.映射日期和时间的类型,指定精度
@Temporal(参数) 参数有3种 只显示时间,只显示日期,时间日期都显示
//@Temporal(TemporalType.DATE) 只显示日期
//@Temporal(TemporalType.TIME) 只显示时间
//@Temporal(TemporalType.TIMESTAMP) 显示日期与时间