web-dev-qa-db-fra.com

Rendre hibernate ignorer les variables de classe qui ne sont pas mappées

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?!

184
hese

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.

387
skaffman

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.

80
CodeMed

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;
    }
27
Saumyaraj