public void insertCustomer(Customer c) {
Configuration cfg = new Configuration().configure();
SessionFactory sf = cfg.buildSessionFactory();
Session s = sf.openSession();
Transaction ts = s.beginTransaction();
                  s.save(c);
                  ts.commit();
                  s.close();
}我反编译看了一下,发现session是接口,在上面的程序中没有具体的类实现session接口,为什么可以调用,并且将数据插入数据库

解决方案 »

  1.   

    Configuration代表java对象至数据库的映像设定,这个对象从hibernate配置文件读取,然后从Configuration取得SessionFactory对象,由它开启一个Session,这样,就算Session是接口也没有问题啊!
      

  2.   

    Session s = sf.openSession(); 从抽象工厂中打开一个Session,这就实例化了Session接口啊,具体应该是new了一个SessionImpl对象。即Session s = new SessionImpl();
    SessionImpl的机构如下:
    public final class SessionImpl
    extends AbstractSessionImpl
    implements EventSource, Session, JDBCContext.Context
    所以程序中s.save(c)等都是调用实现类中的方法,当然可以操作数据啊。
      

  3.   

    Session s 是接口= sf.openSession();//这个是实现接口实现类,
    两者有矛盾吗?
    兄台的java水平不是一般的差啊,o(∩_∩)o...哈哈
      

  4.   


    你去看看JDK里面,很多类都是这样写的了。
      

  5.   

    sf.openSession()---返回session的一个实现类对象。
      

  6.   

    sysout.out.print(session)你就看到他的实现类了
      

  7.   

    你反编译干吗,hibernate是开源的,网上下载下,哥给你贴贴源码,Ctrl+T可以看到实现类(eclipse下)
    SessionImpl实现了EventSource接口public final class SessionImpl extends AbstractSessionImpl 
    implements EventSource, org.hibernate.classic.Session,  
                                 JDBCContext.Context {}而EventSource接口继承了Sessionpublic interface EventSource extends SessionImplementor, Session {}