国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php框架 > 框架设计 > Hibernate之一对多关联映射

Hibernate之一对多关联映射

来源:程序员人生   发布时间:2016-03-24 09:18:29 阅读次数:3370次

这里以顾客、定单为例。1个顾客对应着多个定单。
数据表以下:
顾客表订单表

在双向1对多关联映照中,需要在”1“的1方添加set属性来寄存”多“的1方,在属性上添加@OneToMany注解,mapping指向”1“的表。
同时在”多“的1方,添加”多“的对象属性,在并在这个属性上加上@ManyToOne注解 和@JoinColumn注解,后者的name值为”多“的1方的表中外键列的列名。
需要注意的是,1旦使用1对多关联映照,数据库中1定要添加外键,外键对应的是”1“的1方的主键,所以类型1定是1样的。
实体类:

@Entity @Table(name = "customer", catalog = "etoak") public class Customer implements java.io.Serializable { private Integer id; private String name; private Setorderses = new HashSet(0); public Customer() { } public Customer(String name, Setorderses) { this.name = name; this.orderses = orderses; } @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "id", unique = true, nullable = false) public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } @Column(name = "name", length = 32) public String getName() { return this.name; } public void setName(String name) { this.name = name; } @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "customer") public SetgetOrderses() { return this.orderses; } public void setOrderses(Setorderses) { this.orderses = orderses; } }
@Entity @Table(name = "orders", catalog = "etoak") public class Orders implements java.io.Serializable { private Integer id; private Customer customer; private Integer money; public Orders() { } public Orders(Customer customer, Integer money) { this.customer = customer; this.money = money; } @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "id", unique = true, nullable = false) public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "cid") public Customer getCustomer() { return this.customer; } public void setCustomer(Customer customer) { this.customer = customer; } @Column(name = "money") public Integer getMoney() { return this.money; } public void setMoney(Integer money) { this.money = money; } }

dao层:

public interface IDao{ public boolean add( T obj); public boolean delete( T obj); public boolean update (T obj); public T get(Classcls,int id); }

dao层实现类:

这里注意1下:在使用hibernate的时候必须要提交事务,不然的话履行完 没有毛病,hibernate履行语句也打印出来了,但数据表里面就是没有添加数据。

public class DaoImpl<T> implements IDao<T> { Session session = null; Transaction tx = null; @Override public boolean add(T obj) { try { session = SF.getSession(); tx = session.beginTransaction(); session.save(obj); tx.commit(); return true; } catch (Exception e) { e.printStackTrace(); return false; }finally{ if(session!=null)session.close(); } } public boolean delete(T obj){ try{ session = SF.getSession(); tx = session.beginTransaction(); session.delete(obj); tx.commit(); return true; }catch(Exception e){ e.printStackTrace(); return false; }finally{ if(session!=null) session.close(); } } public boolean update(T obj){ try { session = SF.getSession(); tx = session.beginTransaction(); session.update(obj); tx.commit(); return true; } catch (Exception e) { e.printStackTrace(); return false; } } @Override public T get(Class<T> cls, int id) { try { session = SF.getSession(); tx = session.beginTransaction(); T t =(T) session.get(cls,id); tx.commit(); return t; } catch (Exception e) { e.printStackTrace(); return null; }finally{ if(session!=null)session.close(); } } }

测试类:

public class Test { public static void main(String[] args) { //添加 1 /* 这里注意1下,在添加Customer也就是“1”时,必须要给orders setCustomer值,不然添加后,orders表添加的那1列外键值会为空。 */ Customer cus = new Customer(); cus.setName("etoak"); Orders o1 = new Orders(); o1.setMoney(100); Orders o2 = new Orders(); o2.setMoney(200); cus.getOrderses().add(o1); cus.getOrderses().add(o2); o1.setCustomer(cus);o2.setCustomer(cus); IDaodao = new DaoImpl(); dao.add(cus); //添加 多 Orders o1 = new Orders(); o1.setMoney(1001); IDaocusDao = new DaoImpl(); Customer cus = cusDao.get(Customer.class, 2); o1.setCustomer(cus); IDaodao = new DaoImpl(); dao.add(o1); //删除 多 /*Orders o1 = new Orders(); o1.setId(2); IDaodao = new DaoImpl(); dao.delete(o1);*/ //删除 1 /*Customer cus = new Customer(); cus.setId(2); IDaodao = new DaoImpl(); dao.delete(cus);*/ } }

session工厂类 :
这里要说明1下。 就是使用注解方式和非注解方式这个工厂类是有1点不同的。new 的configuration 不1样。注解方式用的是AnnotationConfiguration类

public class SF { private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml"; private static final ThreadLocalthreadLocal = new ThreadLocal(); private static Configuration configuration = new AnnotationConfiguration(); private static org.hibernate.SessionFactory sessionFactory; private static String configFile = CONFIG_FILE_LOCATION; static { try { configuration.configure(configFile); sessionFactory = configuration.buildSessionFactory(); } catch (Exception e) { System.err .println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } private SF() { } public static Session getSession() throws HibernateException { Session session = (Session) threadLocal.get(); if (session == null || !session.isOpen()) { if (sessionFactory == null) { rebuildSessionFactory(); } session = (sessionFactory != null) ? sessionFactory.openSession() : null; threadLocal.set(session); } return session; } public static void rebuildSessionFactory() { try { configuration.configure(configFile); sessionFactory = configuration.buildSessionFactory(); } catch (Exception e) { System.err .println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } public static void closeSession() throws HibernateException { Session session = (Session) threadLocal.get(); threadLocal.set(null); if (session != null) { session.close(); } } public static org.hibernate.SessionFactory getSessionFactory() { return sessionFactory; } public static void setConfigFile(String configFile) { SF.configFile = configFile; sessionFactory = null; } public static Configuration getConfiguration() { return configuration; } }

hibernate.cfg.xml

<hibernate-configuration> <session-factory> <property name="dialect">org.hibernate.dialect.MySQLDialectproperty> <property name="connection.url">jdbc:mysql://localhost:3306/etoakproperty> <property name="connection.username">rootproperty> <property name="connection.password">rootproperty> <property name="connection.driver_class">com.mysql.jdbc.Driverproperty> <property name="myeclipse.connection.profile">mysqlproperty> <property name="show_sql">trueproperty> <property name="format_sql">trueproperty> <mapping class="com.etoak.entity.Student"/> <mapping class="com.etoak.entity.Classes"/> session-factory> hibernate-configuration>


生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生