Je pensais qu'hibernate ne prenait en compte que les variables de classe annotées avec @Column
. Mais étrangement aujourd'hui, lorsque j'ai ajouté une variable (qui n'est pas mappée sur une colonne, mais simplement une variable dont j'ai besoin dans la classe), il tente d'inclure cette variable dans l'instruction select en tant que nom de colonne et génère l'erreur -
Colonne inconnue 'team1_.agencyName' dans la 'liste de champs'
Ma classe -
@Entity
@Table(name="team")
public class Team extends BaseObject implements Serializable {
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(length=50)
private String name;
@Column(length=10)
private String code;
@Column(name = "agency_id")
private Long agencyId;
private String agencyName; //note: not annotated.
}
FYI ... J'utilise la classe ci-dessus dans une autre classe avec beaucoup de correspondance
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name="user_team",
joinColumns = { @JoinColumn( name="user_id") },
inverseJoinColumns = @JoinColumn( name="team_id")
)
public Set<Team> getTeams() {
return teams;
}
Pourquoi cela arrive-t-il?!
JPA utilisera les propriétés all de la classe, sauf si vous les marquez spécifiquement avec @Transient
:
@Transient
private String agencyName;
L'annotation @Column
est purement facultative et permet de remplacer le nom de colonne généré automatiquement. De plus, l'attribut length
de @Column
n'est utilisé que lors de la génération automatique de définitions de table, il n'a aucun effet sur le temps d'exécution.
Pour les personnes qui trouvent cette publication via les moteurs de recherche, une autre cause possible de ce problème est liée à l'importation de la version de package incorrecte de @Transient
. Assurez-vous que vous importez javax.persistence.transient
et pas un autre paquet.
Placer @Transient
sur le getter avec un champ privé a fonctionné pour moi.
private String name;
@Transient
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}