2017-08-17 94 views
0

我正在努力与Hibernate,并找不到工作的解决方案来做我想做的。这是一个web服务btw。休眠/ @ElementCollection和@XmlRootElement

简短说明: 我有一个对象(Composant)的列表,它必须嵌入到主对象(Projet)中。我想坚持我的数据库(PostgreSQL)。要做到这一点我将它们设置为:

我的第一台被命名为T_PROJET 它containes标记为PRJ_NAME 列表中的ID,我挣扎在ComponentList 和过期日期PRJ_DATE

而为该表被命名为T_COMPOSANT。 有一个自动生成的ID:COMP_ID。 的名称COMP_NOM 值COMP_MONTANT 和优先COMP_IMPORTANCE

在我的HMI,我可以创造一个谟与至少一个Composant但我可以添加更多(最多5 Composant一个谟),以及Composants会保存为列表。

这里是什么,我往往会产生对我的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 
} 
} 

这里的主要对象 “谟”:

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

与 “Composant”:

@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的书,但没有回答,或者我无法正确阅读)。 任何想法,我应该找什么?

感谢您的帮助!

回答

1

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

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

@Column定义了一个列,其中@CollectionTable定义了集合的连接。

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

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

如果您需要Composant作为e ntity:

  1. Projet#getComposants()
  2. 删除@ElementCollection@CollectionTable@Embedded@ColumnComposant
  3. 删除@Embeddable添加@EntityComposant
  4. 注释添加到getComposants()

-

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

感谢您的回答!它适用于第二种解决方案。 – raik