创建实体类的JPA/hibernate问题需要java帮助
我开始为基于Oracle的遗留数据库创建JPA/hibernate映射。一点(早…)我在to表之间有一个多对多关系(FOO,BAR,join table with extra fields:FOO_BAR)。所以我定义了三个实体,为联接表创建了一个可嵌入的Id类,严格遵循了一个好的(?)书
我可以选择一个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 framework(1.0.3.2)附带的hibernate库。冬眠3。jar没有有用的版本信息(Manifest中没有任何内容,Version#getVersionString()
表示[WORKING]
),其他hibernatexxx jar报告为3.1.0。GA(验证器)或3.4.0。GA(实体管理器)
编辑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>();
}
酒吧。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) 个答案