Hibernate框架-05-02-双向一对多关联映射


XML格式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

项目结构

在这里插入图片描述

order.java

package com.hibernate.entity;

public class Order {
    
    

	private Integer id;
	private Double price;
	private User user;
	
	
	
	
	
	public User getUser() {
    
    
		return user;
	}
	public void setUser(User user) {
    
    
		this.user = user;
	}
	public Integer getId() {
    
    
		return id;
	}
	public void setId(Integer id) {
    
    
		this.id = id;
	}
	public Double getPrice() {
    
    
		return price;
	}
	public void setPrice(Double price) {
    
    
		this.price = price;
	}
	@Override
	public String toString() {
    
    
		return "Order [id=" + id + ", price=" + price + "]";
	}
	
	
}

user.java

package com.hibernate.entity;

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

public class User {
    
    

	private Integer id;
	private String userName;
	private String password;
	//域模型中用来表示从用户能够导航到订单数据(从用户到订单的一对多关联)
	//先初始化是为了放置空引用异常
	//Set类型无序,且不重复。
	//要求有顺序的话还是用
	private Set orderSet = new HashSet<>();
	
	public Integer getId() {
    
    
		return id;
	}
	public void setId(Integer id) {
    
    
		this.id = id;
	}
	public String getUserName() {
    
    
		return userName;
	}
	public void setUserName(String userName) {
    
    
		this.userName = userName;
	}
	public String getPassword() {
    
    
		return password;
	}
	public void setPassword(String password) {
    
    
		this.password = password;
	}
	@Override
	public String toString() {
    
    
		return "User [id=" + id + ", userName=" + userName + ", password=" + password + "]";
	}
	public Set getOrderSet() {
    
    
		return orderSet;
	}
	public void setOrderSet(Set orderSet) {
    
    
		this.orderSet = orderSet;
	}
	
	
}

order.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="com.hibernate.entity">
    <class name="Order" table="hibernate_05_01_orders">
        <id name="id" type="int" column="id">
            <generator class="identity"></generator>
        </id>
        <property name="price" column="price" ></property>
         <!-- 映射一对多关系 -->
 		<many-to-one name="user" class="User" column="USER_ID"></many-to-one>
    </class>
</hibernate-mapping>

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 package="com.hibernate.entity">
    <class name="User" table="hibernate_05_01_user">
        <id name="id" type="int" column="id">
            <generator class="identity"/>
        </id>
        <property name="userName" type="java.lang.String" column="name"/>
        <property name="password" type="java.lang.String" column="password"/>
        
        <!-- 映射User与Order之间的一对多关系
        	set标签用来映射Set类型的属性(name)
        	key:指定外键字段名字(此名称是数据库库名称)
        	one-to-many表示一对多关系 -->
        	
        	<!-- 用户与订单这种情况不会产生创建用户也创建订单,
        	删除订单也不会删除用户,所以进选择delete -->
        <set name="orderSet" cascade="delete">
        	<key column="USER_ID"/>
        	<one-to-many class="Order"/>
        </set>
    </class>
</hibernate-mapping>

Test.java

package com.hibernate.ui;

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

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.hibernate.entity.Order;
import com.hibernate.entity.User;
import com.hibernate.util.HibernateUtil;

public class Test {
    
    

	public static void main(String[] args) {
    
    
		saveUserAndOrder();
		
//		addOrder();
		
//		getUserAndOrders();
		
//		deleteUser();
		
		
//		getOrderAndUser();
		
		HibernateUtil.closeSessionFactory();
	}
	
	//保存
	private static void saveUserAndOrder() {
    
    
		Session session = HibernateUtil.openSession();
		Transaction tx = session.beginTransaction();
		
		User u = new User();
		u.setUserName("李四");
		u.setPassword("77777");
		
		Order o = new Order();
		o.setPrice(300.0);
		
		//建立关联
		Set set = new HashSet();
		set.add(o);
		u.setOrderSet(set);
		
		session.save(u);
		session.save(o);
		
		tx.commit();
		session.close();
	}
	
	
	
	
	
	//给已经存在的用户添加新的订单
	private static void addOrder() {
    
    
		Session session = HibernateUtil.openSession();
		Transaction tx = session.beginTransaction();
		
		User u = session.get(User.class, new Integer(1));
		
		//新的订单对象
		Order o = new Order();
		o.setPrice(200.0);
		
		//建立关联
		u.getOrderSet().add(o);
		
		session.save(o);
		tx.commit();
		session.close();
	}
	
	
	//一对一关联式,查询用户也会查询订单
	//一对多时候查询用户仅是用户
	//检索用户数据,并通过用户导航到它所关联的订单
	private static void getUserAndOrders() {
    
    
		Session session = HibernateUtil.openSession();
		//一对多关联映射默认情况下查询用户时,不会连接订单表查询
		User u = session.get(User.class, new Integer(1));
		
		//通过上述用户对象导航到它关联的订单(映射关联关系的优势)
		//这个方法也会触发一次查询
		System.out.println(u.getOrderSet());
		
		session.close();
	}
	
	//由于配置了级联删除操作,所以删除用户时,会自动删除同用户关联的订单
	private static void deleteUser() {
    
    
		Session session = HibernateUtil.openSession();
		Transaction tx = session.beginTransaction();
		
		User u = session.get(User.class, new Integer(1));
		session.delete(u);
		
		tx.commit();
		session.close();
	}
	
	
	
	
	private static void  getOrderAndUser() {
    
    
		Session session=HibernateUtil.openSession();
		Order o=session.get(Order.class,new Integer(2));
		System.out.println(o.getUser());
		System.out.println(o.getUser().toString());
	}

}

注解格式配置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

项目结构

在这里插入图片描述

user.java

package com.hibernate.entity;

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

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="hibernate_05_05_user")
public class User {
    
    

	private Integer id;
	private String name;
	private String password;
	//域模型中用来表示从用户能够导航到订单数据(从用户到订单的一对多关联)
	//先初始化是为了放置空引用异常
	//Set类型无序,且不重复。
	//要求有顺序的话还是用
	private Set orderSet = new HashSet<>();
	
	
	
	
	@Id
	@GeneratedValue(generator ="linshi1" )
	@GenericGenerator(name="linshi1",strategy ="native" )
	public Integer getId() {
    
    
		return id;
	}
	public void setId(Integer id) {
    
    
		this.id = id;
	}

	public String getPassword() {
    
    
		return password;
	}
	public void setPassword(String password) {
    
    
		this.password = password;
	}

	
	
	
	
	
	@Override
	public String toString() {
    
    
		return "User [id=" + id + ", name=" + name + ", password=" + password + ", orderSet=" + orderSet + "]";
	}
	public String getName() {
    
    
		return name;
	}
	public void setName(String name) {
    
    
		this.name = name;
	}
	@OneToMany(targetEntity = Order.class,mappedBy="user",cascade = CascadeType.ALL)
	public Set getOrderSet() {
    
    
		return orderSet;
	}
	public void setOrderSet(Set orderSet) {
    
    
		this.orderSet = orderSet;
	}
	
	
}

test.java

package com.hibernate.ui;

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

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.hibernate.entity.Order;
import com.hibernate.entity.User;
import com.hibernate.util.HibernateUtil;

public class Test {
    
    

	public static void main(String[] args) {
    
    
//		saveUserAndOrder();
		
		addOrder();
		
//		getUserAndOrders();
		
//		deleteUser();
		
		
//		getOrderAndUser();
		
		HibernateUtil.closeSessionFactory();
	}
	
	//保存
	private static void saveUserAndOrder() {
    
    
		Session session = HibernateUtil.openSession();
		Transaction tx = session.beginTransaction();
		
		User u = new User();
		u.setName("李四");
		u.setPassword("77777");
		
		Order o = new Order();
		o.setPrice(300.0);
		
		//建立关联
		Set set = new HashSet();
		set.add(o);
		u.setOrderSet(set);
		
		session.save(u);
		session.save(o);
		
		tx.commit();
		session.close();
	}
	
	
	
	
	
	//给已经存在的用户添加新的订单
	private static void addOrder() {
    
    
		Session session = HibernateUtil.openSession();
		Transaction tx = session.beginTransaction();
		
		User u = session.get(User.class, new Integer(1));
		System.out.println(u.toString());
		
		//新的订单对象
		Order o = new Order();
		o.setPrice(200.0);
		System.out.println(o.toString());
		//建立关联
		u.getOrderSet().add(o);
		o.setUser(u);
		session.save(o);
		tx.commit();
		session.close();
	}
	
	
	//一对一关联式,查询用户也会查询订单
	//一对多时候查询用户仅是用户
	//检索用户数据,并通过用户导航到它所关联的订单
	private static void getUserAndOrders() {
    
    
		Session session = HibernateUtil.openSession();
		//一对多关联映射默认情况下查询用户时,不会连接订单表查询
		User u = session.get(User.class, new Integer(1));
		
		//通过上述用户对象导航到它关联的订单(映射关联关系的优势)
		//这个方法也会触发一次查询
		System.out.println(u.getOrderSet());
		
		session.close();
	}
	
	//由于配置了级联删除操作,所以删除用户时,会自动删除同用户关联的订单
	private static void deleteUser() {
    
    
		Session session = HibernateUtil.openSession();
		Transaction tx = session.beginTransaction();
		
		User u = session.get(User.class, new Integer(1));
		session.delete(u);
		
		tx.commit();
		session.close();
	}
	
	
	
	
	private static void  getOrderAndUser() {
    
    
		Session session=HibernateUtil.openSession();
		Order o=session.get(Order.class,new Integer(2));
		System.out.println(o.getUser());
		System.out.println(o.getUser().toString());
	}

}

order.java

package com.hibernate.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name="hibernate_05_05_orders1")
public class Order {
    
    

	private Integer id;
	private Double price;
	private User user;
	
	
	
	
	//映射多对一关系
	@ManyToOne
	//映射外键字段
	//使用注解方式映射双向一对多是,默认多的一方维护关联关系
	@JoinColumn(name="USER_ID")
	public User getUser() {
    
    
		return user;
	}
	public void setUser(User user) {
    
    
		this.user = user;
	}
	
	@Id
	@GeneratedValue(generator ="linshi2" )
	@GenericGenerator(name="linshi2",strategy ="native" )
	public Integer getId() {
    
    
		return id;
	}
	public void setId(Integer id) {
    
    
		this.id = id;
	}
	public Double getPrice() {
    
    
		return price;
	}
	public void setPrice(Double price) {
    
    
		this.price = price;
	}
	@Override
	public String toString() {
    
    
		return "Order [id=" + id + ", price=" + price + "]";
	}
	
	
}

猜你喜欢

转载自blog.csdn.net/qq_44627608/article/details/115160625