Adnotacje na polach czy metodach typu getters?

Adnotacje na polach czy metodach typu getters?

Artykuł ten ma za zadanie odpowiedzieć na pytanie czy adnotacje powinny być na polach klasy czy na metodach typu getter. Ogólnie nie ma znaczenia czy adnotacje są na polach czy metodach getter o ile te dwa podejścia nie są ze sobą mieszane. Można jednak używać ich zamiennie o ile zastosuje się dodatkową adnotację @Access. W przeciwnym wypadku mieszanie tych dwóch podejść doprowadzi do tego, że aplikacja przestanie działać. Zobaczmy to na przykładach.

Testy dla uproszczenia przeprowadziłem dla bazy plikowej H2:

<dependency>
	<groupId>com.h2database</groupId>
	<artifactId>h2</artifactId>
	<scope>runtime</scope>
	<version>1.4.199</version>
</dependency>

Przykładowa encja User:

@Entity
public class User {
 
    @Id
    @GeneratedValue
    public Long id;
 
    @Column(name = "user_name")
    private String name;
 
    @Column(name = "user_surname")
    private String surname;
 
    public User() {
    }
 
    public User(String name, String surname) {
        this.name = name;
        this.surname = surname;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getSurname() { return surname; }
 
    public void setSurname(String surname) { this.surname = surname; }
 
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
}

zapis:

@GetMapping("/")
public String saveUser() {
    User user = new User("James");
    userRepo.save(user);
    return "saved";
}

w wyniku prawidłowo udało się zapisać encję w bazie danych – wszystkie adnotacje mają zastosowanie:

Zmodyfikujmy teraz encję User do następującej postaci:

@Entity
public class User {
 
    @Id
    @GeneratedValue
    public Long id;
 
    private String name;
 
    @Column(name = "user_surname")
    private String surname;
 
    public User() {
    }
 
    public User(String name, String surname) {
        this.name = name;
        this.surname = surname;
    }
 
    @Column(name = "user_name")
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getSurname() { return surname; }
 
    public void setSurname(String surname) { this.surname = surname; }
 
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
}

W wyniku zapisu do bazy danych otrzymujemy:

co oznacza, że adnotacja:

@Column(name = "user_name")

nie ma już zastosowania!

Zmodyfikujmy encję User do następującej postaci:

@Entity
@Access(AccessType.FIELD)
public class User {
 
    @Id
    @GeneratedValue
    public Long id;
 
    private String name;
 
    @Column(name = "user_surname")
    private String surname;
 
    public User() {
    }
 
    public User(String name, String surname) {
        this.name = name;
        this.surname = surname;
    }
 
    @Column(name = "user_name")
    @Access(AccessType.PROPERTY)
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getSurname() { return surname; }
 
    public void setSurname(String surname) { this.surname = surname; }
 
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
}

Wszystko jest ok! W wyniku otrzymujemy:

co oznacza, że wszystkie adnotacje teraz mają zastosowanie!

Zobacz kod na GitHubie i zapisz się na bezpłatny newsletter!

.

Leave a comment

Your email address will not be published.


*