wake-up-neo.com

Lassen Sie den Ruhezustand Klassenvariablen ignorieren, die nicht zugeordnet sind

Ich dachte, der Ruhezustand berücksichtigt nur Klassenvariablen, die mit @Column. Aber seltsamerweise wird heute, als ich eine Variable hinzufügte (die keiner Spalte zugeordnet ist, sondern nur eine Variable, die ich in der Klasse benötige), versucht, diese Variable in die select-Anweisung als Spaltennamen aufzunehmen, und der Fehler ausgegeben:

Unbekannte Spalte 'team1_.agencyName' in 'Feldliste'

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.

}

Zu Ihrer Information ... Ich verwende die obige Klasse in einer anderen Klasse mit vielen zu vielen Zuordnungen

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

184
hese

JPA verwendet all Eigenschaften der Klasse, es sei denn, Sie markieren sie ausdrücklich mit @Transient:

@Transient
private String agencyName;

Das @Column Annotation ist rein optional und dient dazu, den automatisch generierten Spaltennamen zu überschreiben. Darüber hinaus ist das length -Attribut von @Column wird nur verwendet, wenn Tabellendefinitionen automatisch generiert werden. Dies hat keine Auswirkungen auf die Laufzeit.

387
skaffman

Eine weitere mögliche Ursache für dieses Problem ist der Import der falschen Paketversion von @Transient. Stellen Sie sicher, dass Sie javax.persistence.transient Und kein anderes Paket importieren.

80
CodeMed

Das Platzieren von @Transient Auf Getter mit privatem Feld hat für mich funktioniert.

private String name;

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

    public void setName(String name) {
        this.name = name;
    }
27
Saumyaraj