1. org.hibernate.hql.ast.QuerySyntaxException: unexpected token: member near line 1, column 6 [from member wherememberName=?]
这是hsl语句写错。
//form后为类名,而不是数据库名,hibernate设计目的就是让java代码与数据库分离。
Query query=session.createQuery("from Member where memberName=?");
2. org.hibernate.MappingException: Unknownentity:
如果发现这样的异常,很可能是没有把对象的mapping文件加入到hibernate.cfg.xml文件中。
INFO : org.hibernate.tool.hbm2ddl.SchemaUpdate - schema updatecomplete
org.hibernate.MappingException: Unknownentity: com.gathershell.domain.Manager
atorg.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:628)
atorg.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1366)
atorg.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
atorg.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
atorg.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
atorg.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
atorg.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
atorg.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:563)
atorg.hibernate.impl.SessionImpl.save(SessionImpl.java:551)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:547)
3. could not initialize proxy - no Session
这是懒加载所致,要禁用它:<many-to-onename="bigType"lazy="false"></many-to-one>
写在类上是不行的,<classname="SmallType"table="smallType"lazy="false">,这样不行。
报的异常是:
ERROR: org.hibernate.LazyInitializationException - could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
atorg.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:132)
atorg.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:174)
atorg.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
后来我发现这在有时候并不是自己所想要模式,我在写完domain对象后,用eclipse自动生成toString()方法,这里面也包含了对象属性,即orderForm。
private int id;
private OrderForm orderForm;
private int goodsId;
private float price;
private int number;//订货数量
private Date createTime;//订货时间
@Override
public String toString() {
return"OrderDetail id=" +id + ", orderForm=" +orderForm +", goodsId="
+ goodsId +", price=" +price + ", number=" +number
+ ", createTime=" +createTime;
}
然后在测试时,用System.out.println(orderDetail);出现了上面这种错误。所以把toString()中的对象属性去掉就可以了。
4. Initial SessionFactory creation failed.org.hibernate.HibernateException: Unable to instantiate default tuplizer[org.hibernate.tuple.entity.PojoEntityTuplizer]
这个异常一般是你的mapping文件写错了,检查属性类型,名称是否有错。
我遇到这个是domain类是写private Date createDate;而在配置文件中写的是<property name="createTime" type="java.util.Date"></property>,然后把java文件中的属性名改为createTime就可以了。
5. MySql数据库中不能用leave作字段名
Leave在MySql数据库中是一个保留关键字,如有类的属性名为leave,在配置文件中要明确指定另一个对应的字段名<property name="leave" column="leaveTime"></property>
-----------------------持续更新中--------------------------