zoukankan      html  css  js  c++  java
  • 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就不能相同。

  • 相关阅读:
    Flask发送邮件
    python 可调用对象之类实例
    flask 跨域请求
    flask登录插件 flask-login
    flask 更新数据库
    python事物管理及同步锁
    Django signals 信号作用及用法说明
    python中各个response使用
    Ntp时间服务器
    Iptables-主机防火墙设置
  • 原文地址:https://www.cnblogs.com/overstep/p/2822481.html
Copyright © 2011-2022 走看看