Java 刷新JPA实体时出错

Java 刷新JPA实体时出错,java,hibernate,jpa,stack-overflow,composite-key,Java,Hibernate,Jpa,Stack Overflow,Composite Key,我有以下域模型 Currency ----< Price >---- Product 当我尝试使用产品的一个实例时,我得到了一个StackOverflowerError,因此我怀疑上面的映射中存在某种循环(或其他错误),有人能发现它吗?我已经多次看到这个错误,但我记不起确切的解决方案。我的想法是,您需要从PricePK中删除映射(都是@manytone),并用@AssociationOverrides on Price替换它 @Entity @Inheritance(strateg

我有以下域模型

Currency ----< Price >---- Product

当我尝试使用
产品的一个实例时,我得到了一个StackOverflowerError,因此我怀疑上面的映射中存在某种循环(或其他错误),有人能发现它吗?

我已经多次看到这个错误,但我记不起确切的解决方案。我的想法是,您需要从PricePK中删除映射(都是@manytone),并用@AssociationOverrides on Price替换它

@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@AssociationOverrides({
    @AssociationOverride(name = "pricePK.product", 
                         joinColumns = @JoinColumn(name = "product_id")),
    @AssociationOverride(name = "pricePK.currency", 
                         joinColumns = @JoinColumn(name = "currency_id"))
})
public class Price extends VersionedEntity {
    [...]
}

请检查列名是否正确,因为我看不到产品或货币上的id列。

您是否应该直接在价格实体中将价格与产品和货币的关系声明为manyOne,并用@IdClass(PricePK)注释价格


虽然我不知道Hibernate是如何处理这个问题的,但我已经使用OpenJPA成功地实现了这一点。在这种情况下,PricePK必须使用与Price中相同的名称声明其字段,但使用简单类型(整数而不是货币或产品)。在Price中,您可能需要使用@Id对产品和货币进行注释。请注意,这超出了JPA规范(@IdClass仅支持简单字段)。

我遇到了类似的问题,结果是由CascadeType引起的。所有这些都是在OneToMany注释中定义的。当您刷新产品时,它将尝试刷新持久上下文中的价格

根据具体情况,在实体管理器中刷新产品时,您可能不需要刷新价格就可以过得去,例如:

@OneToMany(mappedBy = "pricePK.product", cascade = {
        CascadeType.PERSIST, CascadeType.MERGE
    }, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.FALSE)
private Collection<Price> defaultPrices = new ArrayList<Price>();
@OneToMany(mappedBy=“pricePK.product”,级联={
CascadeType.PERSIST,CascadeType.MERGE
},删除=真)
@LazyCollection(LazyCollectionOption.FALSE)
private Collection defaultPrices=new ArrayList();

+1,提出了一个很好的问题。不过,我对域模型很好奇。似乎很奇怪,
价格
是由
产品
+
货币
唯一标识的,而不是(比如)它的(标量)值+
货币
。谢谢Matt,
价格
类中实际上也有一个
大十进制金额
字段,但我在这里省略了它,因为它与问题无关,我希望代码列表尽可能简短possible@Don你试过这个方法吗?另外,我没有正确地表达自己,我提到的列名是Price上的列名。因此,我假设在价格表上有两列名为product_id和currency_id。我尝试了您的建议,但它导致了以下错误:
无法确定:com.example.currency、table:Price、columns:[org.hibernate.mapping.Column(currency)]的类型。
@Don是否可以使用EntityManager.find加载其中一个实体(主键),还是错误只发生在刷新时?我记得我以前在哪里见过这种情况,这是一种类似的情况,在实体实例化中有一个循环依赖项,据我所知,Hibernate只处理多对多关系中的依赖项循环。我相信您会注意到bidi和方向关系和循环依赖关系。
@OneToMany(mappedBy = "pricePK.product", cascade = {
        CascadeType.PERSIST, CascadeType.MERGE
    }, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.FALSE)
private Collection<Price> defaultPrices = new ArrayList<Price>();