配置的SessionFactory:null

时间:2012-10-18 10:12:47

标签: java hibernate hibernate-mapping

我已经创建了基本的hibernate应用程序。它抛出错误信息。

错误是:

     Oct 18, 2012 3:36:13 PM org.hibernate.cfg.Environment <clinit>
INFO: Hibernate 3.2.5
Oct 18, 2012 3:36:13 PM org.hibernate.cfg.Environment <clinit>
INFO: hibernate.properties not found
Oct 18, 2012 3:36:13 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: Bytecode provider name : cglib
Oct 18, 2012 3:36:13 PM org.hibernate.cfg.Environment <clinit>
INFO: using JDK 1.4 java.sql.Timestamp handling
Oct 18, 2012 3:36:13 PM org.hibernate.cfg.Configuration configure
INFO: configuring from resource: /hibernate.cfg.xml
Oct 18, 2012 3:36:13 PM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: Configuration resource: /hibernate.cfg.xml
Oct 18, 2012 3:36:13 PM org.hibernate.cfg.Configuration addResource
INFO: Reading mappings from resource : com/crmcall/entity/CallUsers.hbm.xml
Oct 18, 2012 3:36:13 PM org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
INFO: Mapping class: com.crmcall.entity.CallUsers -> crmcallusers
Oct 18, 2012 3:36:13 PM org.hibernate.cfg.Configuration addResource
INFO: Reading mappings from resource : com/crmcall/entity/Customers.hbm.xml
Oct 18, 2012 3:36:14 PM org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
INFO: Mapping class: com.crmcall.entity.Customers -> crmcustomermaster
Oct 18, 2012 3:36:14 PM org.hibernate.cfg.Configuration addResource
INFO: Reading mappings from resource : com/crmcall/entity/User.hbm.xml
Oct 18, 2012 3:36:14 PM org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
INFO: Mapping class: com.crmcall.entity.User -> crmusers
Oct 18, 2012 3:36:14 PM org.hibernate.cfg.Configuration doConfigure
INFO: Configured SessionFactory: null
Initial SessionFactory creation failed.org.hibernate.MappingException: component class not found: string
Exception in thread "main" java.lang.ExceptionInInitializerError
        at com.crmcall.util.HibernateUtil.<clinit>(HibernateUtil.java:27)
        at com.crmcall.dao.UserDAO.<init>(UserDAO.java:23)
        at com.crmcall.dao.UserDAO.main(UserDAO.java:36)
Caused by: org.hibernate.MappingException: component class not found: string
        at org.hibernate.mapping.Component.getComponentClass(Component.java:104)
        at org.hibernate.tuple.component.PojoComponentTuplizer.buildGetter(PojoComponentTuplizer.java:133)
        at org.hibernate.tuple.component.AbstractComponentTuplizer.<init>(AbstractComponentTuplizer.java:43)
        at org.hibernate.tuple.component.PojoComponentTuplizer.<init>(PojoComponentTuplizer.java:38)
        at org.hibernate.tuple.component.ComponentEntityModeToTuplizerMapping.<init>(ComponentEntityModeToTuplizerMapping.java:52)
        at org.hibernate.tuple.component.ComponentMetamodel.<init>(ComponentMetamodel.java:50)
        at org.hibernate.mapping.Component.buildType(Component.java:152)
        at org.hibernate.mapping.Component.getType(Component.java:145)
        at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:253)
        at org.hibernate.mapping.RootClass.validate(RootClass.java:193)
        at org.hibernate.cfg.Configuration.validate(Configuration.java:1102)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1287)
        at com.crmcall.util.HibernateUtil.<clinit>(HibernateUtil.java:24)
        ... 2 more
Caused by: java.lang.ClassNotFoundException: string
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:169)
        at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:100)
        at org.hibernate.mapping.Component.getComponentClass(Component.java:101)

这是我的Hibernate.cfg.xml文件:

     <hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://192.168.1.5:3306/crmtest</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
    <property name="hibernate.hbm2ddl.auto">create-drop</property>
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <!-- Enable Hibernate automatic session context management -->
    <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
   <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

    <mapping resource="com/crmcall/entity/CallUsers.hbm.xml"/>
    <mapping resource="com/crmcall/entity/Customers.hbm.xml"/>
    <mapping resource="com/crmcall/entity/User.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

这是我的User.hbm.xml

    <hibernate-mapping>
  <class name="com.crmcall.entity.User" table="crmusers">
      <composite-id name="userPK" >
           <key-property name="businessUnit" column="BusinessUnit" type="string"/>
           <key-property name="userID" column="UserID" type="string"/>
      </composite-id>

        <property name="recID" >
          <column name="RecID"/>
        </property>

        <property name="password">
          <column name="Password"/>
        </property>

        <property name="userName">
          <column name="UserName"/>
        </property>

        <property name="userType">
          <column name="UserType"/>
        </property>

        <property name="userLevel">
          <column name="UserLevel"/>
        </property>

        <property name="customerCode">
          <column name="CustomerCode"/>
        </property>

        <property name="customerCodeson">
          <column name="CustomerCodeson"/>
        </property>

        <property name="locationCode">
          <column name="LocationCode"/>
        </property>

        <property name="lastUpdatedBy">
          <column name="LastUpdatedBy"/>
        </property>

        <property name="lastUpdatedOn" type="timestamp">
          <column name="LastUpdatedOn"/>
        </property>

      <property name="email" type="string">
          <column name="Email"/>
        </property>

  </class>

</hibernate-mapping>

这是我的召唤地点:

     public class UserDAO {
    private Session session = null;

    public UserDAO() {
        session =  HibernateUtil.currentSession();
    }

     public List<User> getAllUsers() {
        Transaction tn = session.beginTransaction();
        List<User> users = session.createQuery("from crmusers cu order by cu.UserID").list();
        System.out.println("==" + users.size());
        tn.commit();
        return users;
    }


     public static void main(String[] args){
         UserDAO userDAO = new UserDAO();
         userDAO.getAllUsers();
     }
}

这是我的项目文件夹structre: enter image description here

请告诉我代码中的问题是什么?

提前致谢..

6 个答案:

答案 0 :(得分:2)

在User.hbm.xml中,您必须使用type="java.lang.String"(带有大'S')。就是这样。

答案 1 :(得分:1)

据我所知,代码中的问题是由 User.hbm.xml 映射文件引起的。要更精确地使用 composite-id 标签的 type =“string”属性。

据我所知,你不需要强制使用type属性,所以试着跳过它; hibernate应该自动检测它。我不确定最后的情况,因为我没有使用复合键,但有很多例子,人们没有明确定义类型。

答案 2 :(得分:1)

嗯,你的映射文件中有

<key-property name="businessUnit" column="BusinessUnit" type="string"/>
<key-property name="userID" column="UserID" type="string"/>

那应该是...type="java.lang.String"...,但很可能你真的不需要它 - Hibernate会做出(通常非常好的)有根据的猜测。

干杯,

答案 3 :(得分:1)

Hibernate使用reflection来确定runtime处的映射类型。 看来你的映射是正确的,但如果你仍然遇到同样的问题。 我将建议您从所有type attribute类型的属性(例如email,businessUnit,userId

)中删除正在测试的String

对所有String类型属性

尝试这种方式
       <property name="email">
          <column name="Email"/>
        </property>

或者您也可以尝试使用java.lang.String

       <property name="email" type="java.lang.String">
          <column name="Email"/>
        </property>

答案 4 :(得分:1)

“string”和“java.lang.String”都是org.hibernate.type.StringType的别名,因此要么根据命名类型起作用。

我实际上不太确定问题出在User的映射中。该映射看起来很好。根据这个例外,我会更期待你的某个地方

<composite-id ... class="string">

<component ... class="string">

或类似的东西。

答案 5 :(得分:1)

<composite-id name="userPK" >
       <key-property name="businessUnit" column="BusinessUnit" type="String"/>
       <key-property name="userID" column="UserID" type="String"/>
  </composite-id>

尝试将字符串更改为String