最近在搞Hibernate。看到级联删除这一段。按照书本上来。可惜老是出现错误。
org.hibernate.HibernateException: CGLIB Enhancement failed: com.customerandorder.Customer
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.getProxy(CGLIBLazyInitializer.java:104)
at org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory.getProxy(CGLIBProxyFactory.java:49)
at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)
at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3232)
at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:237)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:174)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:86)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:871)
at org.hibernate.impl.SessionImpl.load(SessionImpl.java:788)
at org.hibernate.impl.SessionImpl.load(SessionImpl.java:781)
at com.test.TestCustomerandOrder.main(TestCustomerandOrder.java:44)
Caused by: java.lang.InstantiationException: com.customerandorder.Customer$$EnhancerByCGLIB$$b47a1da9
at java.lang.Class.newInstance0(Class.java:293)
at java.lang.Class.newInstance(Class.java:261)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.getProxy(CGLIBLazyInitializer.java:101)
... 10 more
Exception in thread "main"
真的是很郁闷。
在网上找了一下。看了几个解决的问题。有一个答案是正确的。
错误代码:org.hibernate.HibernateException: CGLIB Enhancement failed: <classname>
答:Hibernate 3的默认方式是把所有类通过代理方式来进行延迟加载。如果代码中的类有一个私有无参的构造器的话,Hibernate将无法在运行时将项目代码中的类作为子类装载。为了避免这个错误,类中的构造器函数至少应该在包内可见。
但是这个解释让我很困惑。创建一个类不是已经直接建立了public的无参构造函数吗!难道还要自己手动在写一个。于是又找寻其他答案。有几个的解释和这个一样。抱着试一下的态度写了两个public的无参构造函数。
public Customer(){}
public Order(){}
结果问题解决了。
而且是一对多的类写个构造函数就可以了。就是说 Order这个构造函数都无需写