2010-01-18 15 views
5

Tengo un proyecto JPA (EclipseLink) existente donde el comportamiento deseado es que si se le da un valor nulo en un campo para una entidad, ese valor nulo no se debe conservar.¿Existe alguna forma de evitar que los valores nulos se mantengan mientras se permite el paso a otros?

El caso de uso es que podemos obtener varias actualizaciones parciales a estas entidades de fuentes externas. Esas fuentes pueden darnos un valor nulo, eso no significa "anular este campo", significa "no tengo este valor".

¿Hay alguna anotación, patrón u otra herramienta que se pueda usar para automatizar una comprobación nula en el colocador O decirle a JPA que no persista valores nulos ????

Puedo atravesar CADA armador en CADA entidad y agregar if(val != null) { //set the value }, pero eso es tedioso y repetitivo.

Por ejemplo, tenemos:


@Entity 
@Table(name = "my_table") 
public class MyObject { 
@Column 
private String myColumn; 

public String getMyColumn() { 
    return this.myColumn; 
} 

public void setMyColumn(String val) { 
    this.myColumn = val; 
} 
} 

me gustaría tener algo que ayudaría de forma automática la siguiente manera:


@Entity 
@Table(name = "my_table") 
public class MyObject { 
@Column 
@DontPersistIfNull 
private String myColumn; 

public String getMyColumn() { 
    return this.myColumn; 
} 

public void setMyColumn(String val) { 
    this.myColumn = val; 
} 
} 

O esto:


@Entity 
@Table(name = "my_table") 
public class MyObject { 
@Column 
private String myColumn; 

public String getMyColumn() { 
    return this.myColumn; 
} 

public void setMyColumn(String val) { 
    //AUTOGENERATED NULL CHECK 
    if(val != null) { 
    this.myColumn = val; 
    } 
} 
} 
+0

pregunta interesante, me gustaría ver una respuesta para ello. ;) Aquí hay algo que parece sugerir que esto será posible: http://projectlombok.org/features/index.html – x4u

+0

Lombok está cerca, pero tendría que modificarlo un poco para generar el patrón que estoy después. – Freiheit

Respuesta

2

Hibernate validator (y cualquier implementación de javax.validation) tiene la anotación @NotNull, que no permitirá que la entidad persista si la propiedad anotada es nula. No estoy seguro de que hibernate-validator funcione con EclipseLink, pero también debería haber una implementación de javax.validation para EclipseLink.

Pero si desea bloquear la configuración de valores nulos, entonces, modifique la capa que establece los valores, en lugar de las entidades mismas.

+0

Creo que esto es lo que estoy esperando. ¿Puedes aclarar un poco? Si la propiedad es nula, ¿no persiste esa propiedad o impide que persista toda la entidad? En otras palabras, hace @NotNull replicar: 1. una restricción de base de datos en una columna no puede ser nulo O 2. No poner una propiedad nulo en una instrucción UPDATE o INSERT – Freiheit

+0

la restricción es a nivel de proveedor de persistencia y la entidad en sí misma no persiste en absoluto. – Bozho

2

No estoy seguro si este es la respuesta que está buscando, pero ha marcado el Null Object Design Pattern

+0

Es un concepto similar al menos. Creo que me gustaría que EclipseLink utilizara ese patrón en lugar de mi código. "Una columna es NullColumn. Cuando se llama col.persist, invoca NullColumn.persist que hace que JPA no agregue esa columna a una instrucción INSERT o UPDATE". – Freiheit

Cuestiones relacionadas