Spring, JPA y DBUnit (2)

Palabras clave:
Tiempo aproximado: 2 min.
Vaya, olvidé ayer explicar un detalle interesante (no imprescindible para los que ya conozcáis JPA). Pero creo que lo correcto es completar el artículo y dejarlo «hecho, hecho».

Se trata de la clase principal de nuestro dominio en el ejemplo: la entidad User.


@Entity
public class User {

@Id
String id;

@Column(unique=true)
private String username;

@Column
private String name;

@Column
private String surname;

public User(String username, String name, String surname) throws UserInitializationException {
this.username = username;
this.name = name;
this.surname = surname;
if ( username == null ) {
throw new UserInitializationException("username is null");
}
if ( "".equals(username.trim())) {
throw new UserInitializationException("username is empty");
}
}

public String getUsername() {
return username;
}

public String getName() {
return name;
}

public String getSurname() {
return surname;
}

/**
* Changing someone's name can have side effects.
*
* @param name
*/
public void changeName(String name) {
this.name = name;
}

/**
* Changing someone's surname can have side effects.
*
* @param surname
*/
public void changeSurname(String surname) {
this.surname = surname;
}

public String getId() {
return this.id;
}

/**
* Private constructor only for JPA-use.
*/
private User() { }


}

Fijaos en dos detalles que sólo tienen que ver con la persistencia:

  • El atributo id (anotado convenientemente con @Id para que el ORM se encargue de generarlo y todo eso) y su correspondiente getter. No tiene nada que ver con el dominio y, por tanto, si fueramos puristas no debería estar en esta clase sino en un DTO especializado. Sin embargo, JPA justamente nos viene a ayudar en esto para evitar esas clases utilitarias que no hacen más que enredarnos…
  • El constructor vacío que hemos dejado como privado tampoco tiene nada que ver con el dominio. De hecho, es el ORM el que lo necesita para instanciar las clases a partir de los datos en la BD. Por eso lo he dejado como privado, porque así evitamos la tentación de usar esta clase como DTO.

El resto es una clase del dominio: una entidad, tal y como la clasificaría Eric Evans y tal y como la hemos estereotipado con la anotación @Entity.