我开始为基于Oracle的遗留数据库创建JPA/hibernate映射。在一个(早期...)点上,我在表(FOO,BAR,带有额外字段的连接表:FOO_BAR)之间存在多对多关系。所以我定义了三个实体,为连接表创建了一个可嵌入的Id类,严格遵循一本好书(?!)的一些示例。JPA/hibernate需要帮助 - 创建实体类时出现问题
我可以选择一个Foo,但每当我尝试从结果集中读取相关的Bars时,就会发生“SQLException:No data found”或“SQLException:General error(S1000)”。我可以在两者之间仅通过改变一些Java类型的实体bean的...
切换日志中包含“找不到数据”错误的下面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语句并将其与“native”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();
编辑
版本 - 我不能不休眠库,随附在播放框架(1.0.3.2)中。 hibernate3.jar没有有用的版本信息(没有在清单中,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
被定义为NUMBER(22)
的Oracle数据库上。上述示例导致“找不到数据”错误,将“BigInteger
”替换为“常规错误”中的Long
结果。并通过桥发送相同的SQL表达式给出一个正确的结果集...
*我'被迫'使用JdbcOdbc桥*哦,我的...如果这可能是相关的,你用什么方言?什么版本的Hibernate? – 2010-09-23 15:26:40
@Pascal - 方言是'Oracle10gDialect',休眠状态是3点的东西(必须查看它)。但是,正如我所说的,原生jdbc(相同的声明)与桥接... – 2010-09-23 16:46:30
是的,我明白了。但是Hibernate涉及这个问题,IMO :) – 2010-09-23 16:54:51