我知道这是一个古老的问题了,但没有找到相关的方法,请知道的哥们把相关的文档url
贴出来也好,很感谢:)我的配置文件如下:
hibernate.connection.driver_class=org.gjt.mm.mysql.Driver
hibernate.connection.password=eclipsee
hibernate.connection.url=jdbc:mysql://localhost/test
hibernate.connection.username=jactive
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50
hibernate.show_sql=true<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="demo.eagerleftout"
default-lazy="true">
<class name="Order" table="orders">
<id column="id" name="id">
<generator class="identity"></generator>
</id>
<property name="info" column="info"></property>
<many-to-one name="customer" class="demo.eagerleftout.Customer" cascade="save-update">
<column name="customer_id"></column>
</many-to-one>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="demo.eagerleftout" >
<class name="Customer" table="custom">
<id type="long" column="id" name="id">
<generator class="identity"></generator>
</id>
<property name="name" column="name"></property>

<set name="orders" inverse="false" lazy="true" cascade="all">
<key column="customer_id"></key>
<one-to-many class="demo.eagerleftout.Order" />
</set>
</class>
</hibernate-mapping>package demo.eagerleftout;import java.util.HashSet;
import java.util.List;
import java.util.Set;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;public class Demo { public static void main(String[] args) {
clear();
setup();
} private static void setup() {
SessionFactory factory = getSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
Customer tom = new Customer("Tom");
Customer linda = new Customer("Linda");

Order tomOrder1 = new Order("Tom_Order001");
Order tomOrder2 = new Order("TomOrder002");
Order tomOrder3 = new Order("TomOrder003");
Order tomOrder4 = new Order("TomOrder004");
attachCustomOrders(tom, tomOrder1, tomOrder2, tomOrder3, tomOrder4);

session.save(tom);
session.save(linda);

tx.commit();

} private static void attachCustomOrders(Customer tom, Order tomOrder1,
Order tomOrder2, Order tomOrder3, Order tomOrder4) {
// 正确设置对应关系
Set<Order> orders = new HashSet<Order>();
orders.add(tomOrder1);
tomOrder1.setCustomer(tom);
orders.add(tomOrder2);
tomOrder2.setCustomer(tom);
orders.add(tomOrder3);
tomOrder3.setCustomer(tom);
orders.add(tomOrder4);
tomOrder4.setCustomer(tom);
tom.setOrders(orders);
} @SuppressWarnings("unchecked")
private static void clear() {

Session session = getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
                // hibernate 就不能自己转了,让我转的不爽
List<Customer> customers = session.createCriteria(Customer.class)
.add(Restrictions.not(Restrictions.isNull("id"))).list();
for(Customer customer : customers)
session.delete(customer);

tx.commit();
}

private static SessionFactory factory;

private static SessionFactory getSessionFactory() {
if(null == factory)
factory = new Configuration()
.addClass(Customer.class)
.addClass(Order.class)
.buildSessionFactory();
return factory;
}
}在使用 clear 时,输出为:
Hibernate: select this_.id as id0_0_, this_.name as name0_0_ from custom this_ where not (this_.id is null)
Hibernate: select orders0_.customer_id as customer3_1_, orders0_.id as id1_, orders0_.id as id1_0_, orders0_.info as info1_0_, orders0_.customer_id as customer3_1_0_ from orders orders0_ where orders0_.customer_id=?
Hibernate: select orders0_.customer_id as customer3_1_, orders0_.id as id1_, orders0_.id as id1_0_, orders0_.info as info1_0_, orders0_.customer_id as customer3_1_0_ from orders orders0_ where orders0_.customer_id=?
Hibernate: update orders set customer_id=null where customer_id=?
Hibernate: delete from custom where id=?
Hibernate: delete from orders where id=?
Hibernate: delete from orders where id=?
Hibernate: delete from orders where id=?
Hibernate: delete from orders where id=?
Hibernate: delete from custom where id=?
我想知道的是,为什么有这么多的 delete from orders where id=?,怎么配置 Customer.hbm.xml 和 Order.hbm.xml
才能让让hibernate执行 delete from orders where customer_id=?,还有,怎样设置参数,能让hibernate把通配符?
换成具体的内容?很感谢

解决方案 »

  1.   

    一般都不会用这种方式,让数据库来处理。。在建约束的时候有一个on delete cascade写在后面就可以了。。主表的数据一删除,它就会自动删除子表的相关数据。。
      

  2.   

    让数据库来处理,方便省事。比用应该程序来控制效率还要高。。二全其美。。还有你除了加on delete cascade 还可以加个on update cascade 主表的主键更新时,子表的外键也会更新。。只是一般情况下主键不会改动。呵
      

  3.   

    数据库这么删除是正确的,也是最安全的。
    因为数据库无法保证你的Company和orders 是单纯的1:n的关系。还是从集合里一个一个的删除比较安全一些。
    JAVA世纪网:Java面试题,JAVA面试技巧,JAVA自测题,Java代码,Java项目,Java学习资料
    老紫竹的家:项目管理,职业规划指导,数据库面试题,智力面试题,相声笑话,儿歌动画片
      

  4.   

    我已经使用
    create table orders (id bigint primary key auto_increment, info varchar(1024), customer_id bigint references custom(id) on delete cascade);
    但是还是有四条 delete from order where id=? ,很让我不爽...
    再说我一直不太愿意使用外键...
    您是说我无论怎么配置 Customer.hbm.xml 和 Order.hbm.xml 都无法让 hibernate
    生成 delete order where customer_id=? 吗?
    hibernate只能使用多个delete from order where id=? 来进行级联删除?
      

  5.   

    有什么配置方法让 hibernate 输出绑定后的sql吗? 把 ? 换成实际值的配置项是哪一个? 
    谢谢:)
      

  6.   


    额滴个神啊。。你删除的时候就不要删对象了啊。。你删对象当然会有。。不是用session.delete()这个方法了。。用HQL
    Query query = session.createQuery("DELETE FROM Orders WHERE ID = ?");
    query.setInteger(0,id);
    query.executeUpdate();你试一下看看,肯定没问题了。。
      

  7.   

    是啊 弄coolhty都恶心了 呵呵thx everybody 我不用 session.delete 就好了,看来每个配置了,自己些个criteria或query就o了
    就是懒么,想看看通过配置文件,hibernate能不能帮上忙哈,看来不能
    可能正如 java2000_net 所说,看来 hibernate group 是故意实现成这样的,能更安全:(
      

  8.   

    Query query = session.createQuery("DELETE FROM Orders WHERE ID = ?");
    query.setInteger(0,id);
    query.executeUpdate();
    这个方法就可以实现,我学会了,谢谢了