我开始为基于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表达式会得到一个正确的结果集…