gpt4 book ai didi

java - Hibernate/@ElementCollection 和 @XmlRootElement

转载 作者:行者123 更新时间:2023-12-02 12:21:36 24 4
gpt4 key购买 nike

我正在与 Hibernate 作斗争,无法找到可行的解决方案来完成我想要的操作。顺便说一句,这是一个网络服务。

简短说明:我有一个必须嵌入到主对象(Projet)中的对象(Composant)列表。我想将两者保留在我的数据库(PostgreSQL)中。为此,我将它们设置如下:

我的第一个表名为 T_PROJET它包含标记为 PRJ_NAME 的 ID我在 ComponentList 上苦苦挣扎的列表以及到期日期 PRJ_DATE

对于较小的对象,该表被命名为 T_COMPOSANT。获得自动生成的 ID:COMP_ID。名称 COMP_NOM值 COMP_MONTANT以及优先级 COMP_IMPORTANCE

在我的 HMI 上,我可以创建一个包含至少一种 Composant 的 Projet,但我可以添加更多(一个 Projet 最多 5 个 Composant),并且这些 Composant 将保存为列表。

以下是我倾向于在 HMI 上生成的 JSON 示例:

{
"name":"Example",
"dateLimite":"2018-08-08",
"composant_1": {
"name":"Vol",
"montant": 1200,
"importance":1
},
"composant_2": {
"name":"Truc",
"montant": 1200,
"importance":1
},
"composant_3": {
"name":"Bidule",
"montant": 1200,
"importance":1
},
"composant_4": {
"name":"Machin",
"montant": 1200,
"importance":1
},
"composant_5": {
"name":"Wesh",
"montant": 1200,
"importance":1
}
}

这是主要对象“Projet”:

@Entity
@Table(name = "T_PROJET")
@XmlRootElement
public class Projet implements Serializable{

private static final long serialVersionUID = 1L;

private String name;
private List<Composant> composants;
private Date dateLimite;

public Projet() {
super();
}

public Projet(String name, List <Composant> composants, Date dateLimite) {
this.name = name;
this.composants = composants;
this.dateLimite = dateLimite;
}

@Id
@Column(name = "PRJ_NOM", nullable = false)
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@ElementCollection
@CollectionTable(name="T_COMPOSANT", joinColumns = @JoinColumn(name = "COMP_ID"))
@Embedded
@Column(name="COMP_ID", nullable = true)
public List<Composant> getComposants() {
return composants;
}

public void setComposants(List <Composant> composants) {
this.composants = composants;
}

@Column(name="PRJ_DATE")
public Date getDateLimite() {
return dateLimite;
}

public void setDateLimite(Date dateLimite) {
this.dateLimite = dateLimite;
}
}

还有“合成剂”:

@Embeddable
@Table(name = "T_COMPOSANT")
@XmlRootElement
public class Composant implements Serializable {
private static final long serialVersionUID = 1L;
private int composant_id;
private String name;

private int montant;

private int importance;

public Composant(){
super();
}

public Composant(final int composant_id, final String name, final int montant, final int importance) {
this.composant_id = composant_id;
this.name = name;
this.montant = montant;
this.importance = importance;
}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "COMP_ID")
public int getComposant_id() {
return composant_id;
}

public void setComposant_id(int composant_id) {
this.composant_id = composant_id;
}



@Column(name = "COMP_NOM",nullable = true)
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Column(name="COMP_MONTANT", nullable = true)
public int getMontant() {
return montant;
}

public void setMontant(int montant) {
this.montant = montant;
}

@Column(name = "COMP_IMPORTANCE", nullable = true)
public int getImportance() {
return importance;
}

public void setImportance(int importance) {
this.importance = importance;
}
}

每次尝试时,我都会收到“在继承状态层次结构中找不到声明类”错误。我确信我错过了一些关于 @ElementCollection 和 @Embeddable 注释的内容,但无法弄清楚到底在哪里(浏览了我的 Antonio Goncalves 的书,但没有答案,或者我只是无法正确阅读)。知道我应该寻找什么吗?

感谢您的帮助!

最佳答案

@ElementCollection/@CollectionTable 可能与 @Embedded/@Column 冲突。

@Embedded 定义嵌入对象,其中 @ElementCollection 定义嵌入对象列表。

@Column 定义列,其中 @CollectionTable 定义集合的联接。

如果您不需要 Composant 作为实体:

  1. getComposants() 中删除 @Embedded@Column
  2. Composant 中删除 @Table(它已在 @CollectionTable 中声明)

如果您需要 Composant 作为实体:

  1. Projet#getComposants 中删除 @ElementCollection@CollectionTable@Embedded@Column ()
  2. Composant 中删除 @Embeddable
  3. @Entity添加到Composant
  4. 将注释添加到 getComposants()

-

@ManyToMany
@JoinTable(
name = "T_PROJET_COMPOSANT",
joinColumns = @JoinColumn(name = "PROJ_ID"),
inverseJoinColumns = @JoinColumn(name = "COMP_ID"),
)

关于java - Hibernate/@ElementCollection 和 @XmlRootElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45742965/

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