经过one-to-one和one-to-many测试没有问题,看直接复制到任何需要DAO的工程中使用
代码
强烈建议在实际使用中加个接口

BaseDAO.JAVA


一个通用的Hibernate DAOpackage com.lusm.HibernateSessionFactory;
一个通用的Hibernate DAO
一个通用的Hibernate DAO
import java.io.Serializable;
一个通用的Hibernate DAO
import java.util.List;
一个通用的Hibernate DAO
一个通用的Hibernate DAO
import org.hibernate.Query;
一个通用的Hibernate DAO
import org.hibernate.Session;
一个通用的Hibernate DAO
}

HibernateSessionFactory.java 我就不发了,每个工程里都有

值得注意到是:
       写代码是必须考虑到效率,资源利用,第一,不要创建无谓的实例,第二,不要写没有必要的返回语句,第三,close是有目的的,不可以滥用,第四,必须考虑到哪一步出错的概率高,必须在下一步先做判断。

如下代码就是很有问题的:
      
    }

使用one-to-many中执行删除时, 你可能会遇到这样的错误

一个通用的Hibernate DAOException in thread "main" org.hibernate.TransientObjectException: the detached instance passed to delete() had a null identifier
  .........
或者
一个通用的Hibernate DAOException in thread "main" org.hibernate.TransientObjectException: the detached instance passed to delete() had a null identifier
一个通用的Hibernate DAO    at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:63)
一个通用的Hibernate DAO    at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:761)
一个通用的Hibernate DAO    at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:739)
一个通用的Hibernate DAO    at com.lusm.HibernateSessionFactory.BaseDAO.delete(BaseDAO.java:44)
一个通用的Hibernate DAO    at com.lusm.main.Del.main(Del.java:19)

一个通用的Hibernate DAOException in thread "main" org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
一个通用的Hibernate DAO    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
一个通用的Hibernate DAO    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
一个通用的Hibernate DAO    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:202)
一个通用的Hibernate DAO    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
一个通用的Hibernate DAO    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144)
一个通用的Hibernate DAO    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
一个通用的Hibernate DAO    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
一个通用的Hibernate DAO    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
一个通用的Hibernate DAO    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
一个通用的Hibernate DAO    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
一个通用的Hibernate DAO    at com.lusm.HibernateSessionFactory.BaseDAO.delete(BaseDAO.java:46)
一个通用的Hibernate DAO    at com.lusm.main.Del.main(Del.java:18)
一个通用的Hibernate DAOCaused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`lusm/test1`, CONSTRAINT `test1_ibfk_1` FOREIGN KEY (`id`) REFERENCES `test` (`id`))
一个通用的Hibernate DAO    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1669)
一个通用的Hibernate DAO    at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1085)
一个通用的Hibernate DAO    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
一个通用的Hibernate DAO    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
一个通用的Hibernate DAO    一个通用的Hibernate DAO 9 more

原因是你的xml配置和数据库创建有问题
下面给出一个成功的例子

many
xml config
一个通用的Hibernate DAO<?xml version="1.0" encoding="utf-8"?>
一个通用的Hibernate DAO
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
一个通用的Hibernate DAO"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
一个通用的Hibernate DAO
<!-- 
一个通用的Hibernate DAO    Mapping file autogenerated by MyEclipse Persistence Tools
一个通用的Hibernate DAO
-->
一个通用的Hibernate DAO
<hibernate-mapping>
一个通用的Hibernate DAO    
<class name="com.lusm.test.Test1" table="test1" catalog="lusm">
一个通用的Hibernate DAO        
<id name="sid" type="java.lang.Integer">
一个通用的Hibernate DAO            
<column name="sid" />
一个通用的Hibernate DAO            
<generator class="increment" />
一个通用的Hibernate DAO        
</id>
一个通用的Hibernate DAO        
<many-to-one name="test"  class="com.lusm.test.Test" fetch="select"  cascade="save-update" >
一个通用的Hibernate DAO            
<column name="id" not-null="true" />
一个通用的Hibernate DAO        
</many-to-one>
一个通用的Hibernate DAO        
<property name="sname" type="java.lang.String">
一个通用的Hibernate DAO            
<column name="sname" length="20" />
一个通用的Hibernate DAO        
</property>
一个通用的Hibernate DAO    
</class>
一个通用的Hibernate DAO
</hibernate-mapping>

code
一个通用的Hibernate DAOpackage com.lusm.test;
一个通用的Hibernate DAO
}

one

xml config
一个通用的Hibernate DAO<?xml version="1.0" encoding="utf-8"?>
一个通用的Hibernate DAO
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
一个通用的Hibernate DAO"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
一个通用的Hibernate DAO
<!-- 
一个通用的Hibernate DAO    Mapping file autogenerated by MyEclipse Persistence Tools
一个通用的Hibernate DAO
-->
一个通用的Hibernate DAO
<hibernate-mapping>
一个通用的Hibernate DAO    
<class name="com.lusm.test.Test" table="test" catalog="lusm">
一个通用的Hibernate DAO        
<id name="id" type="java.lang.Integer">
一个通用的Hibernate DAO            
<column name="id" />
一个通用的Hibernate DAO            
<generator class="increment" />
一个通用的Hibernate DAO        
</id>
一个通用的Hibernate DAO        
<property name="name" type="java.lang.String">
一个通用的Hibernate DAO            
<column name="name" length="20" />
一个通用的Hibernate DAO        
</property>
一个通用的Hibernate DAO        
<set name="test1s" inverse="true">
一个通用的Hibernate DAO            
<key>
一个通用的Hibernate DAO                
<column name="id" not-null="true" />
一个通用的Hibernate DAO            
</key>
一个通用的Hibernate DAO            
<one-to-many class="com.lusm.test.Test1"/>
一个通用的Hibernate DAO        
</set>
一个通用的Hibernate DAO    
</class>
一个通用的Hibernate DAO
</hibernate-mapping>

code
一个通用的Hibernate DAOpackage com.lusm.test;
一个通用的Hibernate DAO
一个通用的Hibernate DAO
import java.util.HashSet;
一个通用的Hibernate DAO
import java.util.Set;
一个通用的Hibernate DAO
}

db sql
一个通用的Hibernate DAOcreate table `lusm`.`test1`(
一个通用的Hibernate DAO`sid` 
INT not null auto_increment,
一个通用的Hibernate DAO`id` 
INT not null,
一个通用的Hibernate DAO`sname` 
varchar(20),
一个通用的Hibernate DAO
primary key (`sid`),
一个通用的Hibernate DAO
index(sid),
一个通用的Hibernate DAO
foreign key(id) references test(id)  ON DELETE CASCADE ON UPDATE CASCADE 
一个通用的Hibernate DAO);
一个通用的Hibernate DAO    
create table `lusm`.`test`(
一个通用的Hibernate DAO        `id` 
INT not null auto_increment,
一个通用的Hibernate DAO       `name` 
VARCHAR(20),
一个通用的Hibernate DAO        
primary key (`id`)
一个通用的Hibernate DAO    );

下面给出 该示例的两个测试类

insert
一个通用的Hibernate DAOpackage com.lusm.main;
一个通用的Hibernate DAO
一个通用的Hibernate DAO
import com.lusm.HibernateSessionFactory.BaseDAO;
一个通用的Hibernate DAO
import com.lusm.test.Test;
一个通用的Hibernate DAO
import com.lusm.test.Test1;
一个通用的Hibernate DAO
一个通用的Hibernate DAO
}

delete
一个通用的Hibernate DAOpackage com.lusm.main;
一个通用的Hibernate DAO
一个通用的Hibernate DAO
import com.lusm.HibernateSessionFactory.BaseDAO;
一个通用的Hibernate DAO
import com.lusm.test.Test;
一个通用的Hibernate DAO
}

相关文章: