我开始为基于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
( - >“常规错误”),我尝试了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_ID
和BAR_ID
在Oracle数据库中定义为NUMBER(22)
。上面的示例导致“找不到数据”错误,将BigInteger
替换为Long
会导致“常规错误”。在桥上发送相同的SQL表达式可以得到正确的结果集......
答案 0 :(得分:0)
找到解决方案或 - 至少 - 发现,该方法无法使用给定的工具(hibernate,JdbcOdbc桥):
最后一些googeling终于把我送到this (german) page,其中有人遇到类似的问题:在使用桥时遇到No data found
SQLException。其他人回答说,代码是正确的,但是JdbcOdbc桥的问题是不支持多次读取结果集。我无法澄清,如果我在这里遇到同样的问题,但我很确定它是这个或类似的情况,问题与使用hibernate / JPA的桥有关。
对于我非常特殊的情况:我在忽略它之后解决了这个问题......终于发现我可以使用oracle oci驱动程序。 (叹息)
感谢所有试图关注我的帖子并想到解决方案的人!