hibernate 简单总结

版权声明:自然 https://blog.csdn.net/qq_38943922/article/details/87601501

userGroup

package review.hibernate.test;

import java.util.HashSet;
import java.util.Set;

public class UserGroup {
	private Integer userGroupId;
	private String userGroupName;//组名
	private Integer userGroupMax;//该组最大人数
	private Integer userGroupCurrent;//该组当前人数
	private Set<User> users=new HashSet<User>();
	public Integer getUserGroupId() {
		return userGroupId;
	}
	public void setUserGroupId(Integer userGroupId) {
		this.userGroupId = userGroupId;
	}
	public String getUserGroupName() {
		return userGroupName;
	}
	public void setUserGroupName(String userGroupName) {
		this.userGroupName = userGroupName;
	}
	public Integer getUserGroupMax() {
		return userGroupMax;
	}
	public void setUserGroupMax(Integer userGroupMax) {
		this.userGroupMax = userGroupMax;
	}
	public Integer getUserGroupCurrent() {
		return userGroupCurrent;
	}
	public void setUserGroupCurrent(Integer userGroupCurrent) {
		this.userGroupCurrent = userGroupCurrent;
	}
	public Set<User> getUsers() {
		return users;
	}
	public void setUsers(Set<User> users) {
		this.users = users;
	}
}

userGrouo.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="review.hibernate.test">
	<class name="UserGroup" table="userGroup">
		<id name="userGroupId">
			<generator class="native"></generator>
		</id>
		<property name="userGroupName" ></property>
		<property name="userGroupMax" ></property>
		<property name="userGroupCurrent" ></property>
		<!-- 
			一对多/多对一在配置文件中配置
			name:实体映射属性
			cascade:级联操作
			save-update:级联保存更新
					delete: 级联删除
					all:save-update+delete
			作用:简化操作
		 -->
		<set name="users" cascade="save-update">
			<!--key: 外键  
				column:外键字段
			-->
			<key column="user_userGroup_id"></key>
			<!-- 
				one-to-many:一对多/多对一的标识
				class:多的类
			 -->
			<one-to-many class="User"/>
		</set>
	</class>
</hibernate-mapping>

user

package review.hibernate.test;

import java.util.HashSet;
import java.util.Set;

public class User {
	private Integer userId;
	private String userName;
	private Boolean userSex;//男 true 女false
	private Double userMoney;
	private UserGroup userGroup;
	private Set<Role> roles=new HashSet<Role>();
	private Set<Links> links=new HashSet<Links>();
	
	public Set<Links> getLinks() {
		return links;
	}
	public void setLinks(Set<Links> links) {
		this.links = links;
	}
	public Set<Role> getRoles() {
		return roles;
	}
	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}
	public UserGroup getUserGroup() {
		return userGroup;
	}
	public void setUserGroup(UserGroup userGroup) {
		this.userGroup = userGroup;
	}
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public Boolean getUserSex() {
		return userSex;
	}
	public void setUserSex(Boolean userSex) {
		this.userSex = userSex;
	}
	public Double getUserMoney() {
		return userMoney;
	}
	public void setUserMoney(Double userMoney) {
		this.userMoney = userMoney;
	}
}

user.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
	hibernate-mapping:hibernate 表字段与实体对象属性映射
	papackage:包名
	如果写了包名就不用写完整类名了
 -->
<hibernate-mapping package="review.hibernate.test">
	<!-- 
		class 映射实体类
		name:完整类名
		table:表名
		lazy:延迟加载 类级别
			true 默认 
			一般情况默认就可以了
	 -->
	<class name="User" table="user" lazy="false">
		<!-- 
			实体类id/表id
			name:实体属性名/默认表字段名
		 -->
		<id name="userId">
			<!-- 
				generator:Hibernate 主键生成器是负责生成数据表记录的主键,通常有如下几种常见的主键生成方式
				class:
				identity:用于MySql数据库。特点:递增
					注:对于MySql数据库使用递增序列时需要在建表时对主键指定为auto_increment属性。
					<id name="id" column="id">  
					< generator class="identity"/>  
					</id>  
				sequence:用于Oracle数据库
					<id name="id" column="id">  
					<generator class="sequence">  
					<param name="sequence">序列名</param>  
					</generator>  
					</id>   
				native:跨数据库时使用,由底层方言产生。 
					Default.sequence为hibernate_sequence
					注:使用native时Hibernate默认会去查找Oracle中的hibernate_sequence序列。 
						如果Oracle中没有该序列,连Oracle数据库时会报错。
						<id name="id" column="id">  
						<generator class="native"/>  
						</id> 
				hilo:通过高低位合成id,先建表hi_value,再建列next_value。必须要有初始值。
				<id name="id" column="id">  
				<generator class="hilo">  
				<param name="table">high_val</param>  
				<param name="column">nextval</param>  
				<param name="max_lo">5</param>  
				</generator>  
				</id>   
				sequencehilo:同过高低位合成id,建一个sequence序列,不用建表。
				<id name="id" column="id">  
				<generator class="hilo">  
				<param name="sequence">high_val_seq</param>  
				<param name="max_lo">5</param>  
				</generator>  
				</id>  
				assigned:用户自定义id;
				id name="id" column="id">   
				<generator class="assigned"/>  
				</id>  
			 -->
			<generator class="native"></generator>
		</id>
		<!-- 
			属性:
			name:实体属性名/默认表字段名
		 -->
		<property name="userName"></property>
		<property name="userSex"></property>
		<property name="userMoney"></property>
		<!-- 一对多/多对一配置 
			name:实体映射对象属性名
			column:外键字段
			class:一的类
			fetch:抓取策略
				select:默认
				join:迫切左连接
		-->
		<many-to-one name="userGroup" column="user_userGroup_id" class="UserGroup" fetch="join"></many-to-one>
		
		<set name="roles">
			<key column="user_role_id"></key>
			<one-to-many class="review.hibernate.test.Role"/>
		</set>
		<!-- 
			多对多
			name:实体映射对象属性名
			table:中间表名
			inverse:如果遇到多对多关系,一定要选择一方放弃维护更新。
			看业务需求,例如:录入员工时需要为员工指定所属角色,那么业务方向就是由员工来维护角色,
				角色不需要维护与员工的关系,角色放弃维护
			lazy:延迟加载 关联级别
				true 默认 (如果session关闭就有no-session问题)
				false:立即加载
				extra:及其懒惰
				fetch:抓取策略
					select 默认值
					join:迫切左外连接
					subselect:子查询
				注:全部使用默认
		 -->
		<set name="links" table="user_links" inverse="true" fetch="select">
			<!-- 
				key 主键
				column:当前表主键/当前映射对象id
			 -->
			<key column="userId"></key>
			<!-- 
				many-to-many:多对多
				class:多对多的另一个类
				column:另一个类的id/另一个表的主键
				lazy:延迟加载 关联级别
					false 默认  是否采用延迟加载取决与一的一方类上的lazy属性的值
					proxy:关联对象时不采用延迟加载
					extra:及其懒惰
				
			 -->
			<many-to-many class="review.hibernate.test.Links" column="linksId" ></many-to-many>
		</set>
	</class>
</hibernate-mapping>

role

package review.hibernate.test;

import java.util.HashSet;
import java.util.Set;

public class Role {
	private Integer roleId;
	private String roleName;
	private User user;
	private Role role;
	private Set<Role> childen=new HashSet<Role>();
	private Set<Responsibility> responsibilitys=new HashSet<Responsibility>();
	
	
	public Set<Responsibility> getResponsibilitys() {
		return responsibilitys;
	}
	public void setResponsibilitys(Set<Responsibility> responsibilitys) {
		this.responsibilitys = responsibilitys;
	}
	public Role getRole() {
		return role;
	}
	public void setRole(Role role) {
		this.role = role;
	}
	public Set<Role> getChilden() {
		return childen;
	}
	public void setChilden(Set<Role> childen) {
		this.childen = childen;
	}
	public Integer getRoleId() {
		return roleId;
	}
	public void setRoleId(Integer roleId) {
		this.roleId = roleId;
	}
	public String getRoleName() {
		return roleName;
	}
	public void setRoleName(String roleName) {
		this.roleName = roleName;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
}

role.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="review.hibernate.test.Role" table="role">
		<id name="roleId">
			<generator class="native"></generator>
		</id>
		<property name="roleName"></property>
		<many-to-one name="user" column="user_role_id" class="review.hibernate.test.User"></many-to-one>
		<many-to-one name="role" column="role_role_id" class="review.hibernate.test.Role"></many-to-one>
		<set name="childen">
			<key column="role_role_id"></key>
			<one-to-many class="review.hibernate.test.Role"/>
		</set>
		<set name="responsibilitys">
			<key column="role_responsibilitys_id"></key>
			<one-to-many class="review.hibernate.test.Responsibility"/>
		</set>
	</class>
</hibernate-mapping>

links

package review.hibernate.test;

import java.util.HashSet;
import java.util.Set;

public class Links {
	private Integer linksId;
	private String linksName;
	private Set<User> users=new HashSet<User>();
	public Integer getLinksId() {
		return linksId;
	}
	public void setLinksId(Integer linksId) {
		this.linksId = linksId;
	}
	public String getLinksName() {
		return linksName;
	}
	public void setLinksName(String linksName) {
		this.linksName = linksName;
	}
	public Set<User> getUsers() {
		return users;
	}
	public void setUsers(Set<User> users) {
		this.users = users;
	}
}

links.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class	name="review.hibernate.test.Links" table="links">
		<id name="linksId">
			<generator class="native"></generator>
		</id>
		<property name="linksName"></property>
		
		<set name="users" table="user_links">
			<key column="linksId"></key>
			<many-to-many class="review.hibernate.test.User" column="userId"></many-to-many>
		</set>
	</class>

</hibernate-mapping>

Responsibility

package review.hibernate.test;

public class Responsibility {
	private Integer responsibilityId;
	private String responsibilityName;
	private Role role;
	public Integer getResponsibilityId() {
		return responsibilityId;
	}
	public void setResponsibilityId(Integer responsibilityId) {
		this.responsibilityId = responsibilityId;
	}
	public String getResponsibilityName() {
		return responsibilityName;
	}
	public void setResponsibilityName(String responsibilityName) {
		this.responsibilityName = responsibilityName;
	}
	public Role getRole() {
		return role;
	}
	public void setRole(Role role) {
		this.role = role;
	}
}

Responsibility.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="review.hibernate.test.Responsibility">
		<id name="responsibilityId">
			<generator class="native"></generator>
		</id>
		<property name="responsibilityName"></property>
		<many-to-one name="role" column="role_responsibilitys_id" class="review.hibernate.test.Role"></many-to-one>
	</class>
</hibernate-mapping>

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- 
			#hibernate.dialect org.hibernate.dialect.MySQLDialect
			#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
			#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
			#hibernate.connection.driver_class com.mysql.jdbc.Driver
			#hibernate.connection.url jdbc:mysql:///test
			#hibernate.connection.username gavin
			#hibernate.connection.password
		 -->
		 <!-- 数据库方言 -->
		<property name="hibernate.dialect" >org.hibernate.dialect.MySQLDialect</property>
		<!-- 驱动类 -->
		<property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</property>
		<!-- 数据库连接路径 -->
		<property name="hibernate.connection.url" >jdbc:mysql:///test?useUnicode=true&amp;characterEncoding=UTF-8</property>
		<!--  用户名-->
		<property name="hibernate.connection.username" >root</property>
		<!-- 用户密码 -->
		<property name="hibernate.connection.password" >root</property>
		<!-- #hibernate.show_sql true 显示sql-->
		<property name="hibernate.show_sql">true</property>
		<!-- hibernate.format_sql true 格式化sql-->
		<property name="hibernate.format_sql">true</property>
		<!-- 
			## auto schema export
			作用:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value=”none”。 
			#hibernate.hbm2ddl.auto create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
			#hibernate.hbm2ddl.auto create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,
				哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。 
			#hibernate.hbm2ddl.auto update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),
				以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,
				表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
			#hibernate.hbm2ddl.auto validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,
				但是会插入新值。
		 -->
		 <property name="hibernate.hbm2ddl.auto">update</property>
		 <!-- 开启线程绑定配置 -->
		<property name="hibernate.current_session_context_class">thread</property>
		 <!-- 映射表 -->
		 <mapping resource="review/hibernate/test/user.hbm.xml"/>
		 <mapping resource="review/hibernate/test/userGroup.hbm.xml"/>
		 <mapping resource="review/hibernate/test/role.hbm.xml"/>
		 <mapping resource="review/hibernate/test/responsibility.hbm.xml"/>
		 <mapping resource="review/hibernate/test/links.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

测试

package review.hibernate.test;


import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import zr.utils.core.Reflex;

public class Main {
	private Session session;
	private Transaction transaction;
	public Main() {
		session();
	}
	private void test() {
		User user = new User();
		user.setUserName("user21");
		user.setUserSex(true);
		user.setUserMoney(100000.0);
		
		
		
		
		User user2 = new User();
		user2.setUserName("user22");
		user2.setUserSex(true);
		user2.setUserMoney(100000.0);
		
		Links links1=new Links();
		links1.setLinksName("link5");
		Links links2=new Links();
		links2.setLinksName("link6");
		
		/*user.getLinks().add(links1);
		user.getLinks().add(links2);
		user2.getLinks().add(links1);
		user2.getLinks().add(links2);
		
		links1.getUsers().add(user);
		links1.getUsers().add(user2);
		links2.getUsers().add(user);
		links2.getUsers().add(user2);*/
		
		/*UserGroup group = new UserGroup();
		group.setUserGroupName("group3");
		group.setUserGroupMax(100);
		Set<User> set = group.getUsers();
		set.add(user);
		set.add(user2);
		group.setUserGroupCurrent(set.size());*/
		
		/*UserGroup group = session.get(UserGroup.class, 1);
		Set<User> set = group.getUsers();
		set.add(user);
		set.add(user2);
		user.setUserGroup(group);
		user2.setUserGroup(group);
		group.setUserGroupCurrent(set.size());*/
		
		/*session.update(group);
		session.save(user);
		session.save(role1);
		session.save(responsibility1);
		session.save(responsibility2);
		session.save(role2);
		session.save(user2);*/
		
		/*session.save(links1);
		session.save(links2);
		session.save(user);
		session.save(user2);*/
		
		Criteria criteria = session.createCriteria(User.class);
		
		criteria.add(Restrictions.eq("userId", 6));
		
		User result = (User) criteria.uniqueResult();
		
		System.out.println(result);
		
//		User user3 = session.get(User.class, 1);
//		UserGroup userGroup = session.get(UserGroup.class, user3.getUserGroup().getUserGroupId());
		
		close();
	}
	
	public Session session() {
		session = new Configuration().configure().buildSessionFactory().openSession();
		transaction=session.beginTransaction();
		transaction.begin();
		return session;
	}
	public void close() {
		if(session!=null && transaction!=null) {
			transaction.commit();
			session.close();
		}
	}
	public static void main(String[] args) {
		Main main = new Main();
		try {
			Reflex.function(main, "test").run();
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}finally {
			System.exit(0);
		}
		
	}
}

附件

猜你喜欢

转载自blog.csdn.net/qq_38943922/article/details/87601501