有些困惑,大家帮忙看看一对多映射时save的一个问题,多谢了!!!
我是在初学hibernate,是仿照书上的例子。我新建了下面两个关联的数据表。create table CUSTOMERS ( ID bigint not null, NAME varchar(15), AGE int, primary key (ID));
create table ORDERS ( ID bigint not null, ORDER_NUMBER varchar(15), PRICE double precision,
CUSTOMER_ID bigint, primary key (ID));
alter table ORDERS add index IDX_CUSTOMER(CUSTOMER_ID),
add constraint FK_CUSTOMER foreign key (CUSTOMER_ID) references CUSTOMERS (ID);
建立了下列hbm.xml
<hibernate-mapping package="com.zl.model">
<class name="Customers" table="customers" >
。。。。
<set name="orderses" lazy="true" cascade="all" inverse="true">
<key>
<column name="CUSTOMER_ID" not-null="true" />
</key>
<one-to-many class="Orders" />
</set>
</class>
</hibernate-mapping>
<hibernate-mapping package="com.zl.model">
<class name="Orders" table="orders" >
<many-to-one name="customers" class="Customers" >
<column name="CUSTOMER_ID" not-null="true" />
</many-to-one>
</class>
</hibernate-mapping>
打开show-sql配置,然后调用下列代码,来测试
public static void main(String[] args) {
Session session = HibernateSessionFactory.getSession();
Customers cust = (Customers)session.get(Customers.class, new Long(2));
Orders order = new Orders();
order.setId(4L);
order.setCustomers(cust);
order.setOrderNumber("zl000004");
cust.getOrderses().add(order);
Transaction tran = session.beginTransaction();
System.out.println("before save!");
session.save(cust);
System.out.println("after save!");
tran.commit();
}
按书上的说法,在tran.commit()时,hibernate只调用一条insert order的语句。
但我发现在调用session.save(cust)时,hibernate并没有调用sql语句。但在tran.commit()时,先执行了一条
select orders_.ID, 。。。。from orders orders_ where orders_.ID=4
再执行insert into orders ...sql语句的。但我看的所有hibernate的书上都没有提到会执行这个select语句的。
那这样执行程序时,效率不就很低了?
我要是执行session.save(order)的话,那就只有一条sql语句。
现在就有些疑惑,为什么书上的例子很多都这样写。请过来人给解惑下,多谢了