有一雇员表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>