2011-01-11 15 views
149

Pensé que hibernate toma en consideración solo las variables de clase que están anotadas con @Column. Pero extrañamente hoy cuando agregué una variable (que no está mapeada en ninguna columna, solo una variable que necesito en la clase), está tratando de incluir esa variable en la declaración de selección como un nombre de columna y arroja el error -Hacer que hibernate ignore las variables de clase que no están mapeadas

Desconocido columna 'team1_.agencyName' en 'lista de campos'

Mi clase -

@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 ... yo uso la clase anterior en otra clase con muchos a muchos mapeo

@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(
     name="user_team", 
     joinColumns = { @JoinColumn(name="user_id") }, 
     inverseJoinColumns = @JoinColumn(name="team_id") 
)  
public Set<Team> getTeams() { 
    return teams; 
} 

¿Por qué está pasando esto ?!

+3

lo siento mucho ... soy nuevo en esto. lo haré para todas mis publicaciones! gracias por contar – hese

+0

@Tunaki no, esto no es exactamente el duplicado de la pregunta "¿La forma más rápida de JPA de ignorar un campo durante la persistencia?" (http://stackoverflow.com/questions/1281952/jpa-fastest-way-to-ignore-a-field-during-persistence) Este ticket es sobre Hibernate, y el otro está hablando de JPA en su lugar. – Yuci

Respuesta

320

APP utilizará todos propiedades de la clase, a menos que los marca específicamente con @Transient:

@Transient 
private String agencyName; 

La anotación @Column es puramente opcional, y está ahí para que pueda reemplazar el nombre de columna generada automáticamente . Además, el atributo length de @Column solo se usa cuando se generan automáticamente definiciones de tabla, no tiene ningún efecto en el tiempo de ejecución.

55

Para las personas que encuentran esta publicación a través de los motores de búsqueda, otra posible causa de este problema es la importación de la versión de paquete incorrecta de @Transient. Asegúrese de importar javax.persistence.transient y no algún otro paquete.

+1

gracias. Me preguntaba si debería ser frijoles o persistencia. – Nasir

+2

gracias, estaba usando org.springframework.data.annotation.Transient y se confundió por qué no funciona. – Rudy

18

Colocando @Transient en getter con campo privado trabajado para mí.

private String name; 

    @Transient 
    public String getName() { 
     return name; 
    } 

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

Poner @Transient en el nivel getter funcionó para mí también. – Dish

Cuestiones relacionadas