Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA标准api通过嵌入ID连接_Java_Hibernate_Jpa_Spring Data_Criteria Api - Fatal编程技术网

Java JPA标准api通过嵌入ID连接

Java JPA标准api通过嵌入ID连接,java,hibernate,jpa,spring-data,criteria-api,Java,Hibernate,Jpa,Spring Data,Criteria Api,我拥有以下实体: @Entity @Table(name = "place_revision") public class PoiRevision { @OneToMany(mappedBy = "pk.revision", cascade = {CascadeType.ALL}) private Collection<PoiRevisionCategory> categoryMapping; // ... } @Entity @Table(name = "

我拥有以下实体:

@Entity
@Table(name = "place_revision")
public class PoiRevision {
    @OneToMany(mappedBy = "pk.revision", cascade = {CascadeType.ALL})
    private Collection<PoiRevisionCategory> categoryMapping;
    // ...
}

@Entity
@Table(name = "place_revision__category")
@AssociationOverrides({
    @AssociationOverride(name = "pk.revision",
        joinColumns = @JoinColumn(name = "place_revision_id")),
    @AssociationOverride(name = "pk.category",
        joinColumns = @JoinColumn(name = "category_id"))
})
public class PoiRevisionCategory {
    @EmbeddedId
    private PoiRevisionCategoryId pk = new PoiRevisionCategoryId();
    // ...
}

@Embeddable
public class PoiRevisionCategoryId implements Serializable {
    @ManyToOne
    private PoiRevision revision;
    @ManyToOne
    private Category category;
    // ...
}

@Entity
@Table(name = "category")
public class Category {
    @ManyToMany(targetEntity = Section.class, cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
    @JoinTable(
        name = "category__section",
        joinColumns = @JoinColumn(name = "category_id"),
        inverseJoinColumns = @JoinColumn(name = "section_id")
    )
    private Collection<Section> sections;
    // ...
}
但是我们不能对这样的连接使用嵌套路径,因为JPA提供者(在我的例子中是Hibernate)只查找
PoiRevisionCategory
类的直接属性。我们不能将嵌入的Id“连接”到结果集,因为它不是一个可管理的实体

我真的被这个问题困住了,这个问题在翻译成SQL时似乎并不复杂,但在ORM方面却有些复杂


任何想法都值得赞赏。

完全切换到元模型API后,它变得更加清晰,我实际上能够加入嵌入式实体,就像我尝试使用字符串API但失败一样

所以正确的方法就是像平常一样加入

Join<PoiRevisionCategory, PoiRevisionCategoryId> pk = mapping.join(PoiRevisionCategory_.pk);
Join<PoiRevisionCategoryId, Category> cats = pk.join(PoiRevisionCategoryId_.category);
CollectionJoin<Category, Section> sec = cats.join(Category_.sections);
conditions.add(sec.get(Section_.id).in(sections));
Join-pk=mapping.Join(porevisioncategory.pk);
Join cats=pk.Join(PoiRevisionCategoryId_uuxAE.category);
CollectionJoin sec=cats.join(类别部分);
在(节)中添加(第get节(节id);
而且它做的很好


多么令人宽慰。

在@gustavo中提到了一些
persistence.xml
设置,以通过hibernate启用
@Embedded
实体管理。听起来这可能有帮助,但也可能有一些负面影响。但是我还找不到这个参数。您是如何让它为您的embeddedID生成元模型的?我的元模型不存在…@Amalgovinus,你好,我写这篇文章已经有一段时间了,我不再有权访问代码本身,但我不记得元模型生成有任何问题。我只是取消了embeddedID并添加了代理密钥,使用以下标准来管理自然密钥实在是太痛苦了:)在处理ORMs时,使用代理密钥通常要容易得多。我当时只是痴迷于数据库纯粹主义的观点。@Amalgovinus元模型生成可以使用hibernate jpamodelgen;然后需要将其配置/添加到maven pom中,以便在maven“生成源”阶段运行。请参考一些指南。
Join<PoiRevisionCategory, PoiRevisionCategoryId> pk = mapping.join(PoiRevisionCategory_.pk);
Join<PoiRevisionCategoryId, Category> cats = pk.join(PoiRevisionCategoryId_.category);
CollectionJoin<Category, Section> sec = cats.join(Category_.sections);
conditions.add(sec.get(Section_.id).in(sections));