版权声明:本文为博主原创文章,未经博主允许不得转载。
本文旨在介绍hibernate的实体与数据库表的各种关系映射
1.多对一/一对多关系映射
User-------用户表
Department -------------部门表
Contact---------------组件部分,(地址类))
下面开始各实体代码:
User.java实体类
package com.huangchao.model; import java.io.Serializable; import java.util.Date; /** * @author huangchao * */ public class User implements Serializable{ private Integer uid ; private String uname ; private String password ; private String gender ; private Integer age ; private Date birth ; private Contact contact ; private Date createtime ; private Department dept ; /** * */ public User() {} public User(String uname, String password, String gender, Integer age, Date birth, Contact contact, Date createtime, Department dept) { super(); this.uname = uname; this.password = password; this.gender = gender; this.age = age; this.birth = birth; this.contact = contact; this.createtime = createtime; this.dept = dept; } public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public Contact getContact() { return contact; } public void setContact(Contact contact) { this.contact = contact; } public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } public Department getDept() { return dept; } public void setDept(Department dept) { this.dept = dept; } @Override public String toString() { return "User [uid=" + uid + ", uname=" + uname + ", password=" + password + ", gender=" + gender + ", age=" + age + ", birth=" + birth + ", createtime=" + createtime + ", dept=" + dept + "]"; } }
各位小伙伴一定要注意:在书写实体类时,最好让实体类实现Serilizable序列化接口,并且实体类代码一定要符合JavaBean规范
Contact.java
/** * */ package com.huangchao.model; /** * @author huangchao * */ public class Contact { private String email ; private String province ; private String city ; private String country ; //县 private String town ; //镇 private String street ; //街道 /** * */ public Contact(){} public Contact(String email, String province, String city, String country, String town, String street) { super(); this.email = email; this.province = province; this.city = city; this.country = country; this.town = town; this.street = street; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getTown() { return town; } public void setTown(String town) { this.town = town; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } @Override public String toString() { return "Contact [email=" + email + ", province=" + province + ", city=" + city + ", country=" + country + ", town=" + town + ", street=" + street + "]"; } }
Department.java
/** * */ package com.huangchao.model; import java.io.Serializable; /** * @author Huangchao * */ public class Department implements Serializable{ private Integer deptid ; private Integer dname ; public Department() { } public Department(Integer dname) { super(); this.dname = dname; } public Integer getDeptid() { return deptid; } public void setDeptid(Integer deptid) { this.deptid = deptid; } public Integer getDname() { return dname; } public void setDname(Integer dname) { this.dname = dname; } }
写完实体类,现在就要开始.hbm.xml文件的创建了,大家可以手写,也可以使用hibernate tools自动创建,,,,,初学都建议自己动手写,这样也可以加深影响,也可以更好的熟悉有hibernate是如何将实体类自动转化为hbm文件的
下面是User.hbm.xml的详细代码 :
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-8-28 12:23:47 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.huangchao.model.User" table="USER"> //设置数据库表为user
<id name="uid" type="java.lang.Integer">
<column name="UID" />
<generator class="native" /> //主键生成策略,native表示让底层数据库自动选择,mysql默认为主键自增
</id>
<!-- 多对一的表关系映射-->
<many-to-one name="dept" class="com.huangchao.model.Department" > //对应的关联外键的生成表的类
<column name="DEPT" /> //对应的外键
</many-to-one>
<property name="uname" type="java.lang.String">
<column name="UNAME" />
</property>
<property name="password" type="java.lang.String">
<column name="PASSWORD" />
</property>
<property name="gender" type="java.lang.String">
<column name="GENDER" />
</property>
<property name="age" type="java.lang.Integer">
<column name="AGE" />
</property>
<property name="birth" type="java.util.Date">
<column name="BIRTH" />
</property>
//以组件的形式添加Contact,该Contact通过component表示后不会自动生成数据库中的表,它会以user数据表的字段的形式添加进数据库user表中
<component name="contact" class="com.huangchao.model.Contact">
<property name="province" column="PROVINCE" type="string" />
<property name="city" column="CITY" type="string" />
<property name="country" column="COUNTRY" type="string" />
<property name="town" column="TOWN" type="string" />
<property name="street" column="STREET" type="string" />
</component>
<property name="createtime" type="java.util.Date">
<column name="CREATETIME" />
</property>
</class>
</hibernate-mapping>
Department.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2016-8-28 0:41:06 by Hibernate Tools 3.5.0.Final --> <hibernate-mapping> <class name="com.huangchao.model.Department" table="DEPARTMENT"> <id name="deptid" type="java.lang.Integer"> <column name="DEPTID" /> <generator class="native" /> </id> <property name="dname" type="java.lang.Integer"> <column name="DNAME" /> </property> </class> </hibernate-mapping>
至此,重启服务器,sessionFactory会自动为我们创建数据库表.
多对多关系映射
Event ---------------------事件 表
Person--------------------用户 表
Person_Event_Relation-----------用户事件关系表
创建实体类
Event.java
/** * */ package com.huangchao.model; import java.io.Serializable; import java.util.Date; import java.util.HashSet; import java.util.Set; /** * @author Administrator * */ public class Events implements Serializable { private Integer eid ; //Primary key private Date date ; private String title ; private Set<Person> person = new HashSet<Person>(); public Integer getEid() { return eid; } public void setEid(Integer eid) { this.eid = eid; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Set<Person> getPerson() { return person; } public void setPerson(Set<Person> person) { this.person = person; } }
Person.java
/** * */ package com.huangchao.model; import java.io.Serializable; import java.util.HashSet; import java.util.Set; /** * @author Administrator * */ public class Person implements Serializable { private Integer id; // Primary Key private String firstname; private String lastname; private Set<Events> events = new HashSet<Events>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } public Set<Events> getEvents() { return events; } public void setEvents(Set<Events> events) { this.events = events; } }
添加实体类所对应的hbm.xml文件
Event.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2016-8-28 0:41:06 by Hibernate Tools 3.5.0.Final --> <hibernate-mapping > <class name="com.huangchao.model.Events" table="EVENT"> <id name="eid" column="EVENT_ID" type="int"> <generator class="native" /> </id> <property name="title" column="TITLE" type="string" /> <property name="date" column="DATE" type="date" /> <set name="person" table="PERSON_EVENT"> <key column="EVENT_ID" /> <many-to-many class="com.huangchao.model.Person" column="PERSON_ID" /> </set> </class> </hibernate-mapping>
Person.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2016-8-28 0:41:06 by Hibernate Tools 3.5.0.Final --> <hibernate-mapping > <class name="com.huangchao.model.Person" table="PERSON"> <id name="id" column="PERSON_ID" type="int"> <generator class="native"/> </id> <property name="firstname" column="FIRST_NAME" type="string" /> <property name="lastname" column="LAST_NAME" type="string" /> <set name="events" table="PERSON_EVENT" inverse="false"> <key column="PERSON_ID" /> <many-to-many class="com.huangchao.model.Events" column="EVENT_ID" /> </set> </class> </hibernate-mapping>
注意:inverse=true是将控制权交给对方,inverse=false是默认的,即Person掌握控制权
至此,所有的多对多关系配置成功,
添加测试文件测试工.
Configuration config = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySetting(config.getProperties()).build();//注册服务,hibernate从4.3开始新添的一个方法,废弃了之前的方法,该 方法更安全更方便.
SessionFactory sessionFactory = config.buildSessinFactory(serviceRegistry);
Session session = sessionFactory.getCurrentSession(); //getCurrentSession()相比于openSession()前者是基于当前线程的,是线程 安全的,前都不用关心session的关闭,更人性化,后者的话是每次服务启动,sessionFActory都 会创建一个session 的实例,这样对服务器的消耗更大,而且需要关心session的关闭
Transaction tx = session.beginTransaction();