zoukankan      html  css  js  c++  java
  • 使用Hibernate注解Annotations进行对象映射的异常处理

     通过Hibernate注解Annotations进行对象映射,想在Oracle数据库中自动创建表,代码如下:

    实体类:

    import javax.persistence.Basic;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    @Entity
    public class Weapon {
    private long id;
    private String name;
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    public long getId() {
     return id;}
    public void setId(long id) {
     this.id = id;}
    @Basic
    public String getName() {
     return name;}
    public void setName(String name) {
     this.name = name;}}

    hibernate.cfg.xml中:

    mapping class="demo.annotations.entity.Weapon"

    测试类:

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.AnnotationConfiguration;
    import demo.annotations.entity.Weapon;

    public class TestAnnotations {
     public static AnnotationConfiguration config2=new AnnotationConfiguration();
     public static SessionFactory sessionFactory;
     public static String config_file="/hibernate.cfg.xml";
     public static void main(String[] args) {
         config2.configure(config_file);
         sessionFactory=config2.buildSessionFactory();
         Session session=sessionFactory.openSession();
         Transaction tx=session.beginTransaction();
         Weapon weapon=new Weapon();
         weapon.setName("屠鹰刀");
         session.save(weapon);
         tx.commit();
         session.close();}}

         运行的时候接连出现异常:首先抛出了无法找到执行类的定义的异常:

         ava.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/

         仔细检查后:发现少导入了一个hibernate-commons-annotations.jar的包,使用Hibernate注解需要三个jar包:ejb3-persistence.jar、hibernate-annotations.jar和hibernate-commons-annotations.jar包。

         导入jar包后继续运行,又报了新的异常:

    890 ERROR JDBCExceptionReporter:101 - ORA-02289: 序列不存在
    Hibernate: select hibernate_sequence.nextval from dual
    859  WARN JDBCExceptionReporter:100 - SQL Error: 2289, SQLState: 42000

        于是开始思考数据库中的序列怎么与表进行关联的问题,审视异常信息后,我把数据库中的序列名称改为了hibernate_sequence,终于渡过这个异常。因为我在@GeneratedValue中设置的是通过sequence自动生成主键武器编号,所以必须要有相应的序列与Weapon表中的主键对应。

         然而天公不作美,此时还是没有成功,报的是表或视图不存在的异常:

    265 ERROR JDBCExceptionReporter:101 - ORA-00942: 表或视图不存在

    265  WARN JDBCExceptionReporter:100 - SQL Error: 942, SQLState: 42000
         这个异常让我丈二和尚抓不着头脑了,注解不能自动地生成表吗?还是我的jar包有问题?我开始总纠结于自己的jar包,怎么调整都不起作用。于是又进行了各种胡乱的尝试,均不成功,开始有些崩溃了。经过屡番失败,在hibernate.cfg.xml中加入property name="hibernate.hbm2ddl.auto"  update  property,执行成功!

        这句话的含义是:只是根据映射文件去和数据库中的表对应起来,如果不一致,就更新表的结构。在自动创建表的环节中需要。这样就正确的建立了Weapon表并且成功添加了一条数据。

  • 相关阅读:
    Java面试之对象拷贝
    Java面试之反射
    Java面试之多线程
    Java面试之容器
    Java面试之基础一
    Java面试之Hibernate
    Mysql进阶
    高并发,不怕不怕「限流算法第一把法器:计数器法」
    SpringBoot加载速度慢
    idea VM options参数优化
  • 原文地址:https://www.cnblogs.com/telwanggs/p/5357898.html
Copyright © 2011-2022 走看看