這里以顧客、定單為例。1個顧客對應(yīng)著多個定單。
數(shù)據(jù)表以下:

在雙向1對多關(guān)聯(lián)映照中,需要在”1“的1方添加set屬性來寄存”多“的1方,在屬性上添加@OneToMany注解,mapping指向”1“的表。
同時在”多“的1方,添加”多“的對象屬性,在并在這個屬性上加上@ManyToOne注解 和@JoinColumn注解,后者的name值為”多“的1方的表中外鍵列的列名。
需要注意的是,1旦使用1對多關(guān)聯(lián)映照,數(shù)據(jù)庫中1定要添加外鍵,外鍵對應(yīng)的是”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層實現(xiàn)類:
這里注意1下:在使用hibernate的時候必須要提交事務(wù),不然的話履行完 沒有毛病,hibernate履行語句也打印出來了,但數(shù)據(jù)表里面就是沒有添加數(shù)據(jù)。
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) { 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); }
}
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>