2010-09-23 77 views
3

我开始为基于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_IDBAR_ID被定义为NUMBER(22)的Oracle数据库上。上述示例导致“找不到数据”错误,将“BigInteger”替换为“常规错误”中的Long结果。并通过桥发送相同的SQL表达式给出一个正确的结果集...

+1

*我'被迫'使用JdbcOdbc桥*哦,我的...如果这可能是相关的,你用什么方言?什么版本的Hibernate? – 2010-09-23 15:26:40

+0

@Pascal - 方言是'Oracle10gDialect',休眠状态是3点的东西(必须查看它)。但是,正如我所说的,原生jdbc(相同的声明)与桥接... – 2010-09-23 16:46:30

+0

是的,我明白了。但是Hibernate涉及这个问题,IMO :) – 2010-09-23 16:54:51

回答

0

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

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

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

感谢大家谁试图按照我发布和思考解决方案!

+0

在投票之前,你可以将任何BigInteger @Column标记为@Column(presicion = 22),看看会发生什么。虽然精度用于BigDecimal值(http://download.oracle.com/javaee/5/api/javax/persistence/Column.html#precision%28%29),但它在使用BigInteger(http:// stackoverflow .COM /问题/ 2916838) – 2010-09-24 13:57:29