1,问题:An AnnotationConfiguration instance is required to use <mapping class="vo.Student"/>
解答:错误:SessionFactory factory = new Configuration().configure().buildSessionFactory(); //这句是用映射文件为xml的
正确:SessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory();//这句是用于注解的
2,问题:@OneToOne or @ManyToOne on vo.StuCour.student references an unknown entity: vo.Student
解答:错误原因(1):配置文件没有添加映射
方法:加上配置:在hibernta.hfg.xml<mapping class="vo.Student"/>
错误原因(2):在实体类public class ClassName上面没有加实体注解,
方法:加上注解:@Entity
@Table(name = "Student", catalog = "sms")
3,问题:mappedBy reference an unknown target entity property: vo.StuCour.stuCours
错误原因:在one-to-many注解配置: @OneToMany (mappedBy = "StuCour"),mappedBy指向的是要关联的属性,而不是要关联的类,
如果这样配置,hibernate则会找vo.StuCour类下面的stuCours属性。但实际上没有这个属性,就会报上面的异常
方法:指定到实际关联的属性:即:@OneToMany (mappedBy = "courseId")
4, 问题:org.hibernate.LazyInitializationException: could not initialize proxy - no Session
错误原因:在manyToOne, oneToOne,manyToMany的时候, 配置是默认需要加载,而配置的时候却 (fetch = FetchType.LAZY)
方法:取消掉:fetch = FetchType.LAZY,或者改成:fetch = FetchType.EAGER
其它相关:在hibernate中查询数据时,我们会这样写:
Session session = Configuration().configure().buildSessionFactory().openSession(); Student stu = (Student)Session.get(ID); session.close(); return stu;
其实在我们返回对象的时候,我们已经关闭了session, 而我们却在其它要用到的地方:Course c = stu.getCourse(); 由于是 fetch = FetchType.LAZY 所以当调用的时候才去查询,但是从上面的代码可以看出,session已经关闭,因此就会报上面的异常。
知道了原因,我们可以有很多种解决方法:
1), 把事务提高到service层。
2), 把使用spring aop来管理。
3), web 项目还可以用openSessionView
5, 问题:could not resolve property: UserName of: com.xm.model.User
原因:hibernate 使用的是hql,hql只认类里面的字段,不认数据库表里面的字段,这个是由于:数据库里面的User表的属性是:UserName,而在class类User.java中的属性为:@Column(name = "UserName") private String username; 自己在拼写hql的时候,类似于这样的代码片段:where UserName = ? , 所以会出这个错误;
方法:正确实的应该是: where username = ? 在拼写hql的时候应该注意思hql里面的字段,表名是对应java class的类名,属性名,而不是数据库的表名,字段名。
6, 问题: annotation 多对一(ManyToOne)的问题
@Entity(name = "lender") public class Lender implements java.io.Serializable{ @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "id", unique = true, nullable = false) Integer id; @Enumerated(EnumType.STRING) @Column(name="LenderDocumentationCommunication") private LenderDocumentationCommunication lenderDocumentationCommunication; @ManyToOne(optional=false,cascade=CascadeType.ALL) @JoinColumn(name="LenderHeadOfficeId") private Office lenderHeadOffice; @ManyToOne(optional=false,cascade=CascadeType.ALL) @JoinColumn(name="LenderUnderwritingOfficeId") private Office lenderUnderwritingOffice; //省略其它方法 }
上面的多对一是一个类的多个对象,并且名字不一样。
解决方法:如上,已经是能通过的方法,@ManyToOne(cascade=CascadeType.ALL)
其中:@joinColumn的name:指定生产的外键的字段名,默认是:类名_id,
从以上可以看出这个name是用来指定外键的,所以如果一个对象的多个类的话name就不能相同。