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

时间:2016-08-18 14:55:07

标签: java hibernate jpa

我有一个实体,它有两个相同类型的Embedded个类,哪个类型具有相同类型2的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;
}

2 个答案:

答案 0 :(得分:1)

你有什么理由决定使用这种结构吗?通常,在将对象转换为RDBMS时,您需要对关系建模。使用嵌入时,它会将与其关联的列(或列)添加到表中。所以当你正常地这样做(不是收藏)时,这很好。

当你进行收集时,它会遇到问题。主要是没有办法在一行中表示集合(因为这是一个实体,你可以有很多这样的实体,每个对象只有一行有效)&amp;一栏。因此,当您表示一个集合时,您实际上必须有一个第二个表,其中一列引用它回到第一个表。这与普通物体的思维方式完全相反。集合条目需要知道它们与哪些集合相关联,而不是知道其条目的集合。

所以在某些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;
}

我希望这会有所帮助。

答案 1 :(得分:0)

Google上的快速搜索在StackOverflow中显示了这一点:

JPA Multiple Embedded fields

似乎你必须对可嵌入类中的字段进行一些显式注释覆盖。链接答案中也有一些代码示例,可以让您了解去哪里。

干杯,