【问题标题】:jpa - Multiple @ElementCollection in two different @Embeddable classesjpa - 两个不同的 @Embeddable 类中的多个 @ElementCollection
【发布时间】:2016-12-25 13:46:44
【问题描述】:

我有一个具有两个相同类型的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

你们知道什么是错误的吗?我该如何解决?

编辑:

由于 cmets 我做了这个编辑,但它也不起作用

@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;
}

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    在 Google 上的快速搜索在 StackOverflow 中发现了这一点:

    JPA Multiple Embedded fields

    似乎您必须做一些显式的注释来覆盖可嵌入类中的字段。链接的答案中也有一些代码示例,它们应该可以让您很好地了解该去哪里。

    干杯,

    【讨论】:

    • 我已经尝试过同样的帖子并做了@AttributeOverride(name = "parcelas", column = @Column(name = "parcelasDespesa")) 但它没有更改属性的名称 parcelas 并且错误仍然存​​在
    • 您是否在每个嵌入对象上都使用了那行代码?我相信他们实际上需要引用数据库中的不同物理列。所以它需要看起来更像这样(假设我理解正确):@Embedded@AttributeOverride(name = "parcelas", column = @Column(name = "parcelasDeReceita"))private CronogramaDeDesembolso cronogramaDeReceita;@Embedded@AttributeOverride(name = "parcelas", column = @Column(name = "parcelasDespesa"))private CronogramaDeDesembolso cronogramaDeDespesa;
    • 我按照您的建议进行了更改,但仍然无效 =[
    • 嗯。好的,我将继续做一些研究,看看我能找到什么帮助。同时,您是否尝试过做一个只有字符串和整数的可嵌入类?我想知道您是否有一个对象列表(也有注释或没有?)这一事实是否导致了这个问题的一部分。
    • 非常感谢。我会试试你的建议,看看它会把我引向何方。
    【解决方案2】:

    您有什么理由决定使用这种结构吗?通常,在将对象转换为 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;
    }
    

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多