gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:35:20 26 4
gpt4 key购买 nike

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

让我们检查一下我的类(class):

@Entity
public class Etapa extends EntidadeBase {

@Embedded
private CronogramaDeDesembolso cronogramaDeReceita;

@Embedded
private CronogramaDeDesembolso cronogramaDeDespesa;
}

@Embeddable
public class CronogramaDeDesembolso {

@ElementCollection
private List<Parcela> parcelas;
}

我收到以下错误日志。

Caused by: org.hibernate.HibernateException: Found shared references to a collection: 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 时,您需要对关系进行建模。当您使用嵌入时,它会将与其关联的列添加到表中。因此,当您正常执行此操作(而不是集合)时,就可以了。

当你进行 Collection 时,它会遇到问题。主要是没有办法在一行中表示一个集合(因为这是一个实体,您可以拥有许多实体,因此对于每个对象来说,您只有一行)和一列。因此,当您表示一个集合时,您实际上必须有第二个表,其中有一列将其引用回第一个表。这确实与正常物体的思维相反。集合条目需要知道它们与哪个集合关联,而不是集合了解其条目。

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

我希望这有帮助。

关于java - jpa - 两个不同的 @Embeddable 类中的多个 @ElementCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39021411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com