繁体   English   中英

jpa-两个不同的@Embeddable类中的多个@ElementCollection

[英]jpa - Multiple @ElementCollection in two different @Embeddable classes

我有一个具有两个相同类型的Embedded类的实体,其中一个具有两个相同类型的ElementCollection 业务逻辑显然是正确的,但是我猜我遇到了一些JPA知识不足的问题。

让我们检查一下我的课程:

@Entity
public class Etapa extends EntidadeBase {

    @Embedded
    private CronogramaDeDesembolso cronogramaDeReceita;

    @Embedded
    private CronogramaDeDesembolso cronogramaDeDespesa;
}

@Embeddable
public class CronogramaDeDesembolso {

    @ElementCollection
    private List<Parcela> parcelas;
}

我收到以下错误日志。

原因:org.hibernate.HibernateException:找到对集合的共享引用:nexxus.convenioestadual.dominio.planodetrabalho.etapa.Etapa.cronogramaDeReceita.parcelas

你们对哪里出问题有任何线索,我该如何解决?

编辑:

适当的评论,我做了这个编辑,但也没有用

@Entity
public class Etapa extends EntidadeBase {

    @Embedded
    @AttributeOverride(name = "parcelas", column = @Column(name = "parcelasReceita"))
    private CronogramaDeDesembolso cronogramaDeReceita;

    @Embedded
    @AttributeOverride(name = "parcelas", column = @Column(name = "parcelasDespesa"))
    private CronogramaDeDesembolso cronogramaDeDespesa;
}

您是否有任何理由决定使用此结构? 通常,将对象转换为RDBMS时,需要对关系进行建模。 当您使用可嵌入对象时,它将与之关联的一个或多个列添加到表中。 因此,当您正常执行此操作(而不是收集操作)时,就可以了。

当您进行收集时,会遇到问题。 主要是没有办法在单行中表示一个集合(因为这是一个实体,因此对于每个对象只有一行,您可能会非常有效地拥有很多)和一列。 因此,当您表示一个集合时,您实际上必须有第二个表,该表的列将其引用回到第一个表。 与正常对象的想法实际上是相反的。 集合条目需要知道它们与哪个集合相关联,而不是知道该集合的条目。

因此,在某些POJO中,您可能会拥有这些...。

 MyListObject {
     //Some implementation of things you want to collect
 }


 MyClass {
     List<MyListObject> myListObject;
}

但是要在JPA中对此建模,则需要用两个表来表示。

您的对象将在列表中。

@Entity
MyListObject {

    @ManyToOne
    @JoinColumn(name = "MY_CLASS_KEY")
    private MyClass myClass;
}

您的对象/实体将具有列表。

@Entity
MyClass {

    @Id
    @Column(name = "MY_CLASS_KEY")
    private Long myClassKey;

    @OneToMany(mappedBy = "myClass")
    private List<MyListObject> myString;
}

我希望这有帮助。

在Google上进行的快速搜索在StackOverflow中启用了此功能:

JPA多个嵌入式字段

似乎您必须对可嵌入类中的字段进行一些显式注释覆盖。 链接的答案中也有一些代码示例,这些代码示例应该使您对去向有一个很好的了解。

干杯,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM