我是在初学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
打开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语句。
现在就很疑惑,为什么书上的例子很多都这样写。请过来人给解惑下,多谢了
那是hibernate在自行检查有无重复记录
你吧配置文件的ID改为 uuid.hex方式
你在保存的时候 不用去管ID hibernate自行管理
在customer的映射文件中:
你把inverse="true"改成inverse="false"试试
问题是在hibernate的one-many中保存对象时控制权在谁手中,从你的配置文件中Orders类对象是有保存控制权的,当你保存customer时必须首先从内存中select出来Orders对象,然后选择customer对象进行set设置,之后保存Orders对象
你的Customer对象是从数据库中查询出来,当然要出一条select语句了。Customers cust = (Customers)session.get(Customers.class, new Long(2));
调用session下的get函数就是根据主键进行查询。