代码之家  ›  专栏  ›  技术社区  ›  Andreas Dolk

JPA/Hibernate所需的帮助-创建实体类时出现问题

  •  3
  • Andreas Dolk  · 技术社区  · 15 年前

    我开始为基于Oracle的遗留数据库创建JPA/Hibernate映射。在一个(早期…)点上,我在到表(foo,bar,join table with extra fields:foo_bar)之间有一个多对多的关系。所以我定义了三个实体,为连接表创建了一个可嵌入的ID类,严格遵循good(?!)书。

    我可以选择一个foo,但是每当我试图从结果集中读取相关的条时,我会得到一个“sqlException:no data found”或一个“sqlException:general error(s1000)”。我可以通过改变实体bean的一些Java类型来在两者之间切换…

    日志包含“未找到数据”错误的第n行:

    INFO org.hibernate.type.LongType - could not read column value from result set: Foo1_2_; No data found
    

    foo-id和bar-id列定义为 NUMBER(22) . 我试过了 Long 类型优先,这导致“找不到数据”, Double 导致“一般性错误”。然后我在某个地方读到了 NUMBER BigDecimal (->“一般错误”),我尝试过 BigInteger 相反(->“未找到数据”)。

    我迷路了。

    当我从日志中获取SQL语句并将其与“本机”JDBC一起使用时,…它工作得很好。

    PreparedStatement prep = con.prepareStatement(sqlQueryFromHibernateLogs);
    prep.setBigDecimal(1, new  BigDecimal(1));
    ResultSet rs = prep.executeeQuery();  // result set has the correct values...
    

    任何帮助、建议、有用资源的指针都将受到高度赞赏。哦,最后一件事要提:我“被迫”使用JDBCodbc桥。这真的是一个遗留系统…


    我的select语句如下:

    List<Foo> foos = em.createQuery("select f from Foo f order by f.name").getResultList();
    

    编辑

    版本-我绑定到随Play框架(1.0.3.2)提供的Hibernate库。jar没有有用的版本信息(清单中没有任何内容, Version#getVersionString() [WORKING] ,另一个hibernatexxx jars报告为3.1.0.ga(验证器)或3.4.0.ga(EntityManager)。


    编辑2

    我已经将类减少到绝对最小,错误仍然存在。我就是这样做的:

    Java版

    @Entitiy @Table(name="FOO")
    public class Foo {
      @Id @Column(name="FOO_ID")
      private BigInteger fooId;
    
      Foo(){}
    
      @OneToMany(mappedBy="foo")
      private Set<FooBar> fooBars = new HashSet<FooBar>();
    }
    

    java酒吧

    @Entitiy @Table(name="BAR")
    public class Bar {
      @Id @Column(name="BAR_ID")
      private BigInteger fooId;
    
      Bar(){}
    
      @OneToMany(mappedBy="bar")
      private Set<FooBar> fooBars = new HashSet<FooBar>();
    }
    

    爪哇福巴

    @Entitiy @Table(name="FOOBAR")
    public class FooBar {
    
      @Embeddable
      public static class Id implements Serializable {
        @Column(name="FOO_ID")
        private BigInteger fooId;
        @Column(name="BAR_ID")
        private BigInteger barId;
    
        Id() {}
    
        // implementations of hashcode and equals
    
      }
    
      @Embedded
      private Id id = new Id();
    
      @ManytoOne @JoinColumn(name = "FOO_ID", insertable=false, updatable=false)
      private Foo foo;
    
      @ManytoOne @JoinColumn(name = "BAR_ID", insertable=false, updatable=false)
      private Bar bar;
    
      FooBar(){}
    }
    

    FOO_ID BAR_ID 定义为 数字(22) 在Oracle数据库中。上面的示例导致“找不到数据”错误,替换 大整数 具有 导致“一般错误”。在桥上发送相同的SQL表达式会得到一个正确的结果集…

    1 回复  |  直到 15 年前
        1
  •  0
  •   Andreas Dolk    15 年前

    找到了解决方案,或者至少找到了方法无法与给定的工具(Hibernate、JDBCodbc网桥)一起使用的问题:

    又来了些谷歌,最后把我送到了 this (german) page 有人有类似的问题:a No data found 使用网桥时出现SQLException。其他人回答说,代码是正确的,但JDBCodbc网桥存在问题,它不支持多次读取结果集。我不能澄清,如果我在这里有同样的问题,但我很确定这是一个或类似的情况,并且问题与使用带有hibernate/jpa的桥接器有关。

    对于我的特殊情况:我解决了这个问题,在…终于发现我 可以 使用Oracle OCI驱动程序。( 叹息 )

    感谢所有试图跟踪我的帖子并考虑解决方案的人!

    推荐文章