JPA / hibernate所需的帮助 - 创建实体类的问题

时间:2010-09-23 14:38:00

标签: java oracle hibernate jpa

我开始为基于Oracle的遗留数据库创建JPA / hibernate映射。在一个(早期......)点,我与表之间存在多对多关系(FOO,BAR,具有额外字段的连接表:FOO_BAR)。所以我定义了三个实体,为连接表创建了一个可嵌入的Id类,严格遵循一本好的(?!)书中的一些例子。

我可以选择一个Foo但是每当我尝试从结果集中读取相关的Bars时,我得到一个“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( - &gt;“常规错误”),我尝试了BigInteger( - &gt;“找不到数据”)。< / p>

我迷路了。

当我从日志中获取sql语句并将其与“native”jdbc一起使用时,...它可以正常工作。

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

非常感谢任何帮助,建议和有用资源的指示。哦,最后要提一句:我'被迫'使用JdbcOdbc桥。这真的是一个遗留系统......


我的选择陈述是这样的:

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

修改

版本 - 我绑定了play框架(1.0.3.2)附带的hibernate库。 hibernate3.jar没有有用的版本信息(Manifest中没有任何内容,Version#getVersionString()表示[WORKING]),其他hibernatexxx jars报告为3.1.0.GA(验证器)或3.4.0.GA(entitymanager)


修改2

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

Foo.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>();
}

Bar.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>();
}

FooBar.java

@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_IDBAR_ID在Oracle数据库中定义为NUMBER(22)。上面的示例导致“找不到数据”错误,将BigInteger替换为Long会导致“常规错误”。在桥上发送相同的SQL表达式可以得到正确的结果集......

1 个答案:

答案 0 :(得分:0)

找到解决方案或 - 至少 - 发现,该方法无法使用给定的工具(hibernate,JdbcOdbc桥):

最后一些googeling终于把我送到this (german) page,其中有人遇到类似的问题:在使用桥时遇到No data found SQLException。其他人回答说,代码是正确的,但是JdbcOdbc桥的问题是不支持多次读取结果集。我无法澄清,如果我在这里遇到同样的问题,但我很确定它是这个或类似的情况,问题与使用hibernate / JPA的桥有关。

对于我非常特殊的情况:我在忽略它之后解决了这个问题......终于发现我可以使用oracle oci驱动程序。 (叹息

感谢所有试图关注我的帖子并想到解决方案的人!