使用JPA在Hibernate中复合键连接

时间:2015-02-06 00:28:42

标签: java hibernate jpa

我在尝试解决这个问题时遇到了一些麻烦,但是在Java和谷歌上已经取得了很大的成就。

我想加入两张桌子。它们都具有复合主键,子表在父PK中具有相同的列,另外还有两个额外的列。在Java中,类看起来粗略(忽略getter / setter等),如下所示:

@Embeddable
public class ParentKey {
    private Date someDate;
    private String someKeyField;
}

@Embeddable
public class ChildKey {
    private Date someDate;
    private String someKeyField;
    private String anotherKeyField;
}

我尝试根据java.util.DateString来查询“父”。理想情况下,热切地在Set<Child>someDate上加入someKeyField加入。

我已经达到了能够为父级获取数据的程度,但在获取子级时它会以ORA-01858: a non-numeric character was found where a numeric was expected进行轰炸。我假设它与java.util.Date字段有某些,但我不确定是什么。

两个实体类看起来像这样:

@Entity
public class Parent {

    @EmbeddedId
    private ParentKey key;

    @OneToMany(fetch = EAGER, mappedBy = "parent")
    private Set<Child> children;

    private String someData;
    // more data
}

@Entity
public class Child {

    @EmbeddedId
    private ChildKey key;

    @ManyToOne
    @JoinColumn({
        @JoinColumn(name = "SOME_DATE", insertable = false, updatable = false),
        @JoinColumn(name = "SOME_KEY_FIELD", insertable = false, updatable = false),
    })
    private Parent parent;

    private String someChildData;
    // more data
}

父表和子表都有&#34; SOME_DATE&#34; (日期类型)和&#34; SOME_KEY_FIELD&#34; (vachar2类型)列中。当我打印查询时,我可以看到Hibernate尝试第二个查询,因此它找到了一些父母并且正在寻找孩子。

我可能在上面做了一些错误的事情,但我无法想象我所做的任何会导致ORA-01858的事情。即使我删除了所有其他字段并纯粹贴在关键字段上,我也会遇到同样的错误,所以我觉得Hibernate做了一些意想不到的事情,我只是不知道是什么。

有没有更好的方式来进行此类加入或组织我的@EmbeddedIds?我正在做的事情是否存在明显错误?

编辑:我已打印出儿童查询的绑定变量,并以错误的顺序绑定。我认为如果有一种方法可以指定父项中的字段以及它们绑定到哪一列,这将解决。

1 个答案:

答案 0 :(得分:0)

在查看显示绑定变量的Hibernate调试之后,很明显它没有绑定子查询中的正确参数(Hibernate生成)。它似乎有点随机。

referencedColumnNames添加到@JoinColumn注释即可修复它。