2011-01-11 17 views
149

Ich dachte, Hibernate berücksichtigt nur Klassenvariablen, die mit @Column kommentiert sind. Aber seltsamerweise, als ich heute eine Variable hinzufügte (die keiner Spalte zugeordnet ist, nur eine Variable, die ich in der Klasse brauche), versucht sie, diese Variable als Spaltenname in die select-Anweisung aufzunehmen und den Fehler -Hibernate ignorieren Klassenvariablen, die nicht zugeordnet sind

Unbekannte Spalte 'team1_.agencyName' in 'field list'

Meine Klasse -

@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 ... verwende ich die obige Klasse in eine andere Klasse mit vielen zu vielen Mapping

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

Warum passiert das ?!

+3

sehr leid ... ich bin neu zu diesem. werde es für alle meine Posts tun! Danke fürs Erzählen. – hese

+0

@Tunaki nein, das ist nicht genau das Duplikat der Frage "JPA schnellste Möglichkeit, ein Feld während der Persistenz zu ignorieren?" (http://stackoverflow.com/questions/1281952/jpa-fastest-way-to-ignore-a-field-during-persistence) Dieses Ticket ist über Hibernate, und das andere spricht stattdessen über JPA. – Yuci

Antwort

320

JPA wird alle Eigenschaften der Klasse verwenden, wenn Sie speziell sie mit @Transient markieren:

@Transient 
private String agencyName; 

Die @Column Annotation rein optional ist, und ist es Ihnen die automatisch generierten Spaltennamen zu lassen außer Kraft setzen . Darüber hinaus wird das length Attribut von @Column nur beim automatischen Generieren von Tabellendefinitionen verwendet, es hat keine Auswirkungen auf die Laufzeit.

55

Für Leute, die dieses Posting über die Suchmaschinen finden, ist eine andere mögliche Ursache für dieses Problem vom Importieren der falschen Paketversion von @Transient. Stellen Sie sicher, dass Sie javax.persistence.transient und nicht ein anderes Paket importieren.

+1

danke. Ich fragte mich, ob es Bohnen oder Ausdauer sein sollte. – Nasir

+2

danke, war org.springframework.data.annotation.Transient und war verwirrt, warum es nicht funktioniert. – Rudy

18

Platzieren @Transient auf getter mit privatem Feld arbeitete für mich.

private String name; 

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

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

@Transient auf Getter-Ebene zu setzen, hat auch für mich funktioniert. – Dish

Verwandte Themen