2012-04-06 85 views
5

我試圖讀取一個延遲初始化實體ProductUnits這是一個持久集合,併爲此打開一個新會話。GenericJDBCException:無法加載實體

Session session = HibernateUtil.getSessionFactory().openSession(); 
session.update(stock.getProduct()); 
List<ProductUnits> units = new ArrayList<ProductUnits>(stock.getProduct().getUnits()); 

的問題是在它拋出異常

org.hibernate.exception.GenericJDBCException: could not load an entity: [hibernate.tables.plain.Product#1] 

運行時間,但同時做一個一步一步調試運行完全正常。是不是該session.update需要一些時間還是我失去了一些東西

異常堆棧是

Exception in thread "AWT-EventQueue-0" org.hibernate.exception.GenericJDBCException: could not load an entity: [hibernate.tables.plain.Product#2] 
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126) 
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114) 
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
at org.hibernate.loader.Loader.loadEntity(Loader.java:1895) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65) 
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3072) 
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434) 
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415) 
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165) 
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:121) 
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905) 
at org.hibernate.impl.SessionImpl.immediateLoad(SessionImpl.java:863) 
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:95) 
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:140) 
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190) 
at hibernate.tables.plain.Product_$$_javassist_15.getUnits(Product_$$_javassist_15.java) 
at bill.mainBill.InputProductsPanel.computeStockAvailablity(InputProductsPanel.java:278) 
at bill.mainBill.InputProductsPanel.findStock(InputProductsPanel.java:242) 
at bill.mainBill.ProductDetailPanel.setStats(ProductDetailPanel.java:315) 
at bill.mainBill.ProductDetailPanel$3.focusLost(ProductDetailPanel.java:187) 
at java.awt.AWTEventMulticaster.focusLost(Unknown Source) 
at java.awt.Component.processFocusEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$000(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 


    Caused by: java.sql.SQLException: Invalid value for getInt() - 'N' 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) 
at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2727) 
at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2815) 
at org.hibernate.type.IntegerType.get(IntegerType.java:51) 
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184) 
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:173) 
at org.hibernate.type.AbstractType.hydrate(AbstractType.java:105) 
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2124) 
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1404) 
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1332) 
at org.hibernate.loader.Loader.getRow(Loader.java:1230) 
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:603) 
at org.hibernate.loader.Loader.doQuery(Loader.java:724) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
at org.hibernate.loader.Loader.loadEntity(Loader.java:1881) 
... 48 more 

然後映射文件如下

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Apr 3, 2012 1:21:15 PM by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
<class name="hibernate.tables.plain.ProductUnits" table="PRODUCT_UNITS"> 
    <composite-id mapped="false" unsaved-value="undefined"> 
    <key-many-to-one class="hibernate.tables.plain.Product" 
    column="Product_ID" name="product"/> 
    <key-many-to-one class="hibernate.tables.plain.Unit" column="Unit_ID" name="unit"/> 
    </composite-id> 
    <property generated="never" lazy="false" name="basePrice" type="java.lang.Double"> 
    <column name="BASE_PRICE"/> 
    </property> 
</class> 
</hibernate-mapping> 

和產品映射

<class name="hibernate.tables.plain.Product" table="PRODUCT"> 
     <id name="id" type="java.lang.Long"> 
      <column name="ID" /> 
      <generator class="assigned" /> 
     </id> 
     <property name="name" type="java.lang.String"> 
      <column name="NAME" /> 
     </property> 
     <property name="recommendedHolding" type="java.lang.Double"> 
      <column name="RECOMMENDED_HOLDING" /> 
     </property> 
     <set name="units" table="Product_Units" inverse="false" lazy="true"> 
      <key> 
       <column name="Product_ID" /> 
      </key> 
      <one-to-many class="hibernate.tables.plain.ProductUnits" /> 
     </set> 
     <property name="active" type="java.lang.Character"> 
      <column name="ACTIVE" /> 
     </property> 
    </class> 
+1

,並會幫助,如果你向我們展示了完整的異常堆棧跟蹤 – 2012-04-06 07:31:26

+0

,也請提供'Product'的Hibernate映射。 – nobeh 2012-04-06 08:59:48

回答

2

存在您的問題:

Caused by: java.sql.SQLException: Invalid value for getInt() - 'N' 
+0

那麼關鍵是我甚至無法弄清楚爲什麼會出現這樣的情況,表中或實體中沒有_INT_ datamember。這可能是指「Character」字段isActive。不知道MYSQL是否將字符視爲int。 – 2012-04-06 08:42:37

+0

是PRODUCT_UNITS表的'isActive'字段部分? – 2012-04-06 08:49:33

+0

沒有它的產品表的一部分。 – 2012-04-06 08:52:27

3

似乎Hibernate在將字符值N映射到java.lang.Boolean時遇到問題。

如果您需要映射java.lang.Boolean也許最好使用java.lang.Booleanorg.hibernate.type.YesNoType而不是'java.lang.Character'。您可以在reference中閱讀更多內容。

或者您需要使用java.lang.Character,請按照reference註冊自定義類型。

2

好變化從人物到字符串

<property name="active" type="java.lang.String"> 
    <column name="ACTIVE" /> 
</property> 
+0

我試過這個解決方法:) – 2012-04-20 14:08:30

1

屬性類型我發現了另一個參考指出休眠蒙上了字符爲int(即使文檔狀態字符是一個可用的數據類型...)。其他答案應該解決這個問題。或者我會建議你只使用一個varchar(1)來代替 - 相同的最終結果。

即)

@Column(name = "column", nullable = false, length = 1) 
public String getColumn() { 
    return column; 
} 

<property name="active" type="java.lang.String"> 
     <column name="ACTIVE" length="1"/> 
    </property> 
2

我懷疑你的問題是從你的映射設置arrising:

<composite-id mapped="false" unsaved-value="undefined"> 

注:

未保存值(可選 - 默認爲「明智」值): 指示實例最近的標識屬性值 實例化(未保存),將其與 保存或加載到先前會話中的分離實例區分開。

該設置導致PRODUCT_UNITS不能持續。

Hibernate3中幾乎不需要unsaved-value屬性。

+0

但它仍然沒有回答爲什麼它在調試過程中運行良好。 – 2012-04-24 19:44:40

0

請檢查persistence.xml文件添加適當的類 注:persistence.xml文件的 - 數據源不正確匹配

+0

這應該是一個評論,而不是一個答案。檢查這個[metaSO問題](http://meta.stackexchange.com/questions/7656/how-do-i-write-a-good-answer-to-a-question)和[Jon Skeet:Coding Blog]( http://msmvps.com/blogs/jon_skeet/archive/2009/02/17/answering-technical-questions-helpfully.aspx)如何給出正確的答案。 – Yaroslav 2012-10-11 11:54:49