Hibernate one to many 关联关系映射

本文介绍了一个雇员与汽车销售记录的多对一关联映射案例,使用Hibernate框架实现数据库操作,包括创建表结构、保存、删除及更新实体。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一雇员表salesman,有一汽车销售记录表carorder1:一个雇员可能销售多量汽车,有多个销售记录,但一个销售记录只属于一个雇员。


 

1.数据库建表:

create table salesman(sid int not null primary key, salesName varchar(20));

create table carorder1(cid int not null primary key, carname varchar(20),

salesId int not null, foreign key(salesId) references salesman(sid));

2. model类, 映射文件:

 

3 测试类:

package ie.basicCar;

import java.sql.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import ie.basicCar.bean.CarOrder;
import ie.basicCar.bean.Salesman;

public class Test {

 Configuration cfg;

 SessionFactory sf;

 Session session;

 public static void main(String[] args) {

  Test test = new Test();
  test.DoConfiguration();
  test.saveEntity();
  //test.deleteEntity();
  //test.updateEntity();
  System.out.println("end");
 }

 void DoConfiguration() {
  // new a configuration and read the configuration from the given path
  cfg = new Configuration();
  cfg.configure("ie/basicCar/hibernate.cfg.xml");

  // use the properites in the configure file to new a sessionFactory
  sf = cfg.buildSessionFactory();
 }

 void saveEntity() {
  session = sf.openSession();
  // save a BasicCar in database
  Transaction tx1 = session.beginTransaction();
  CarOrder co1 = new CarOrder("order11111");
  CarOrder co2 = new CarOrder("order11112");
  Salesman salesman1 = new Salesman("yyyyyy11111");
  
  salesman1.getCarorders().add(co1);
  salesman1.getCarorders().add(co2);
  co1.setSalesman(salesman1);
  co2.setSalesman(salesman1);
  // carorder.hbm.xml没有cascade=save-update时,保存order前没有保存salesman有问题
  // salesman.hbm.xml没有cascade=save-update时,保存salesman前没有保存order有问题
  
  //设置cascade=all或save-update后,以下三个save操作,执行其中一个,即可把其他两个也save了,说明两个表关联起来了
  //session.save(salesman1);
  session.save(co1);
  //session.save(co2);
  tx1.commit();

  // close session
  session.close();
 }

 void deleteEntity() {
  // new a session from sessionfactory
  session = sf.openSession();
  // delete the id=1 basicCar Object from database
  Transaction tx3 = session.beginTransaction();
  try {
   // 如果carorder.hbm.xml中cascade设置了delete,那么,执行下面的delete order出错,
   // 因为他把salesman也删除了,但是salesman还被其他order关联,不能删除,所以报:Data truncation:
   // Column set to default value; NULL supplied to NOT NULL column
   // 'salesId' at row 1
   // 如果不设置,就只是删除了carorder,对salesman 没影响
   //CarOrder co = (CarOrder) session.load(CarOrder.class, new Long(13));
   // 如果address.hbm.xml有cascade="delete",那么可以连着把salesman也删除,否则只删除address
   //session.delete(co);

   // 如果salesman.hbm.xml中cascade没有设置delete,那么,执行下面的delete order出错,
   // 因为他把salesman也删除了,关联他的order就会没了关联,所以不能删除alesman,所以报:Data
   // truncation: Column set to default value; NULL supplied to NOT
   // NULL column 'salesId' at row 1
   // 如果设置了,而且设置了inverse=true,会连着把 order也删除;(没有inverse=true,会报和上面一样的错
   Salesman sas = (Salesman) session.load(Salesman.class, new Long(3));

   session.delete(sas);

  } catch (Exception e) {
   System.out.println("id=1 car are not existed, can't be deleted");
  }
  tx3.commit();
  // close session*/
  session.close();
 }

 void updateEntity() {
  // new a session from sessionfactory
  // 把cid=7的order的salesman从原来的sid=15号,更新为14号
  session = sf.openSession();
  // update the name of besicCar above into database
  Transaction tx2 = session.beginTransaction();
  Salesman sNew = (Salesman) session.load(Salesman.class, new Long(4));
  //CarOrder co1 = (CarOrder) session.load(CarOrder.class, new Long(534));//此order原来对应的salesman是4,现在把其对应的salesman变为5
  //co1.setSalesman(sNew); 
  //co1.getSalesman().setSalesname("zhangsan222");//通过子表,把主表的属性改了(把salesman的名字改了)
  // a1.getSalesman().setSalesname("ccc2");
  // bc2.setName("SHCar");
  
  //sNew.setSalesname("ewtwewe");
  Iterator it=sNew.getCarorders().iterator();
  
  Set s=new HashSet();
  int i=0;
  while(it.hasNext()){
   CarOrder c=new CarOrder();
   c=(CarOrder)it.next();
   c.setCarname("why1");
   if(i!=1){
    s.add(c);
   }
   i++;
   
  }
  
  
  sNew.setCarorders(s);
  session.update(sNew);

  // Salesman sas2 = (Salesman) session.load(Salesman.class, new Long(9));
  // sas2.getSaddress().setCity("nanjing2");
  // session.update(sas2);
  tx2.commit();

  // close session
  session.close();
 }

 void queryEntity() {
  // new a session from sessionfactory
  session = sf.openSession();
  // query a car from database
  /*
   * try{ Query query=session.createQuery("from BasicCar"); BasicCar
   * bc3=(BasicCar)query.list().get(0); System.out.println("name for the
   * first selected car is: "+bc3.getName()); }catch (Exception e) {
   * System.out.println("no car in database"); }
   */

  // close session
  session.close();
 }

}


4.加入Hibernate jar包和jdbc驱动,Hibernate配置文件

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.password">embed</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@192.168.100.231:1521:typt</property>
        <property name="hibernate.connection.username">dbcdc</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</property>
        <!--  mapping resource="basicCar/bean/BasicCar1.hbm.xml"/-->
        <mapping resource="ie/basicCar/bean/CarOrder.hbm.xml"/>
        <mapping resource="ie/basicCar/bean/Salesman.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值