Есть ли способ предотвратить сохранение нулевых значений при разрешении других?

У меня есть существующий проект JPA (EclipseLink), в котором желаемое поведение заключается в том, что если в поле для объекта задано нулевое значение, это нулевое значение не должно сохраняться.

Вариант использования заключается в том, что мы можем получить несколько частичных обновлений этих сущностей из внешних источников. Эти источники могут дать нам нулевое значение, которое не означает «обнулить это поле», это означает «у меня нет этого значения».

Есть ли аннотация, шаблон или другой инструмент, который можно использовать для автоматизации нулевой проверки в установщике ИЛИ сообщить JPA, чтобы он не сохранял нулевые значения????

Я могу просмотреть КАЖДЫЙ сеттер в КАЖДОЙ сущности и добавить if(val != null) { //set the value } , но это утомительно и повторяется.

Например, у нас есть:


@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;
 }
}

Я хотел бы иметь что-то, что автоматически помогало бы так:


@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;
 }
}

Или это:


@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;
  }
 }
}

person Freiheit    schedule 18.01.2010    source источник
comment
Интересный вопрос, хотелось бы увидеть на него ответ. ;) Вот что-то, что, кажется, предполагает, что это будет возможно: projectlombok.org/features/index.html   -  person x4u    schedule 18.01.2010
comment
Ломбок близок, но мне нужно немного его подправить, чтобы создать шаблон, который мне нужен.   -  person Freiheit    schedule 18.01.2010


Ответы (2)


валидатор Hibernate (и любая реализация javax.validation) имеет аннотацию @NotNull, которая запрещает объекту сохраняться, если аннотированное свойство имеет значение null. Я не уверен, что hibernate-validator будет работать с EclipseLink, но должна быть реализация javax.validation и для EclipseLink.

Но если вы хотите заблокировать установку нулей — ну тогда модифицируйте слой, который устанавливает значения, а не сами сущности.

person Bozho    schedule 18.01.2010
comment
Думаю, это то, на что я надеюсь. Не могли бы вы немного пояснить? Если свойство имеет значение null, оно не сохраняет это свойство или препятствует сохранению всей сущности? Другими словами, @NotNull реплицирует: 1. ограничение базы данных, при котором столбец не может быть нулевым ИЛИ 2. не помещать нулевое свойство в инструкцию UPDATE или INSERT. - person Freiheit; 18.01.2010
comment
ограничение находится на уровне поставщика постоянства, а сама сущность вообще не сохраняется. - person Bozho; 19.01.2010

Не уверен, что это тот ответ, который вы ищете, но проверили ли вы Шаблон проектирования пустых объектов

person Mihir Mathuria    schedule 18.01.2010
comment
По крайней мере, это похожая концепция. Я думаю, что хотел бы, чтобы EclipseLink использовал этот шаблон, а не мой код. Столбец — это NullColumn. Когда вызывается col.persist, вызывается NullColumn.persist, из-за чего JPA не добавляет этот столбец в оператор INSERT или UPDATE. - person Freiheit; 18.01.2010