hibernate 注解的问题(异常)集合

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就不能相同。

原文地址:https://www.cnblogs.com/overstep/p/2822481.html