2012-05-15 95 views
0

我寫了一個映射,如下圖所示:Hibernate映射創建表

<hibernate-mapping auto-import="true" default-lazy="false"> 
    <class name="com.saman.entity.hibernate.EmployeeEntity" 
      table="Employee" optimistic-lock="version"> 

     <id name="id" type="java.lang.Integer" > 
      <column name="Id" /> 
      <generator class="identity"/> 
     </id> 
     <timestamp name="version" source="db"/> 
     <property name="firstName"> 
      <column name="FirstName" sql-type="nvarchar(300)"/> 
     </property> 
     <property name="lastName"> 
      <column name="LastName" sql-type="nvarchar(300)"/> 
     </property> 
     <property name="employeeType"> 
      <column name="EmployeeType" sql-type="nvarchar(300)"/> 
     </property> 
     <!-- 
     <set name="shifts" table="Shifts" inverse="true" lazy="true" fetch="select"> 
      <key> 
       <column name="Id" not-null="true"/> 
      </key> 
      <one-to-many class="com.saman.entity.hibernate.ShiftEntity"/> 
     </set> 
     --> 
     <properties name="u1" unique="true"> 
      <property name="firstName"/> 
      <property name="lastName"/> 
      <property name="employeeType"/> 
     </properties> 

    </class> 
</hibernate-mapping> 

當我運行我的應用程序時出現錯誤象下面這樣:

2012-05-15 17:12:38651 - WARN - 不成功的模式語句:創建表員工(Id整數不爲空auto_increment,版本日期時間不爲空,名字nvarchar(300),姓氏nvarchar(300),EmployeeType nvarchar(300),主鍵(Id),唯一(firstName,lastName ,employeeType)) com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:指定的鍵太長;最大的密鑰長度是1000字節 在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本機方法) 在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27 ) 在java.lang.reflect.Constructor.newInstance(Constructor.java:513) 在com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 在com.mysql.jdbc.Util.getInstance(的Util .java:386) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609) at com.mysql.jdbc.MysqlIO .checkErrorPacket(MysqlIO.java:3541) at co m.mysql.jdbc.MysqlIO.sendCommand在com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)(MysqlIO.java:2002) 在com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java: 2618) 在com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1749) 在com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1666) 在com.mchange.v2.c3p0.impl。 NewProxyStatement.executeUpdate(NewProxyStatement.java:64) 在org.springframework.orm.hibernate3.LocalSessionFactoryBean.executeSchemaStatement(LocalSessionFactoryBean.java:1115) 在org.springframework.orm.hibernate3.LocalSessionFactoryBean.executeSchemaScript(LocalSessionFactoryBean.java:1087) at org.springframework.orm.hibernate3.LocalSessionFactoryBean $ 1.doInHibernate(LocalSessionF actoryBean.java:942) 在org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406) 在org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:339) 在有機springframework.orm.hibernate3.LocalSessionFactoryBean.updateDatabaseSchema(LocalSessionFactoryBean.java:935) 在org.springframework.orm.hibernate3.LocalSessionFactoryBean.afterSessionFactoryCreation(LocalSessionFactoryBean.java:883) 在org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet( AbstractSessionFactoryBean.java:213) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) 在org.springframework.beans.factory.support.AbstractAut owireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory。 Java的:456) 在org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:291) 在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) at org.springframework。beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563) 在org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 在org.springframework.context.support.AbstractApplicationContext.refresh( AbstractApplicationContext.java:425) 在org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:139) 在org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:83) 在Main.main( Main.java:18)

它有什麼問題嗎?

即時通訊使用MySQL和我在MAMP上運行它。

+1

郵政完整的堆棧跟蹤,以及後期的索引導致此異常的代碼被拋出。 –

+0

我改變了它:D – saman

回答

2

指定的密鑰太長;最大密鑰長度爲1000字節

此錯誤表示您的唯一索引(firstName,lastName,employeeType)超過1000個字節,這是最大值。從MySQL文檔

"UTF-8 encoding of the Unicode character set using one to three bytes per character" 

因此,你可以看到你有300長度的三場,所以你可能有大小300 * 3 * 3 = 2700> 1000

2

MyISAM引擎存在已知的問題。您可以試試這個link將引擎更改爲InnoDB: