有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

创建实体类的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_IDBAR_ID在Oracle数据库上定义为NUMBER(22)。上面的示例导致“找不到数据”错误,将BigInteger替换为Long导致“一般错误”。在桥上发送相同的SQL表达式会得到正确的结果集


共 (0) 个答案