как позволить Hibernate генерировать "является нулевым" вместо значения столбца bing к нулю - PullRequest
0 голосов
/ 22 февраля 2011

Есть ли способ позволить hibernate генерировать SQL-запрос, используя "is null" в дополнение к привязке значения к null? Я использую DB2, я объяснил детали в следующем:

В моем проекте я использовал следующие постоянные классы для сопоставления с таблицами БД (я использовал ElementCollection для сопоставления коллекции экземпляров B в экземпляре A):

@Entity
@Table(name = "A")
public class A implement Serializable {
   @Id
   @Colum(name = "A_A")
   private a_A;

   @ElementCollection(fetch = FetchType.EAGER)
   @JoinTable(name = "B", joinColumns = @JoinColumn(name = "B_A", nullable = false))
   @Fetch(FetchMode.SUBSELECT)
   private Set<B> A_Bs = new HashSet<B>();;
   ....
}

@Embeddable
@Table(name = "B")
@Access(AccessType.FIELD)
public class B implements Serializable {
   @Column(name B_C)
   private String C;

   @Column(name B_D)
   private String D;

.....
}

когда я пытаюсь обновить экземпляр сущности A, я вижу следующие sqls Hibernate, сгенерированные самим собой (поскольку в B нет определения id, в общем случае имеет смысл просто слепо обновлять коллекцию в любом случае):

delete from B where B_A=? and B_C=? and B_D=? 
insert into B (B_A, B_C, B_D) values (?, ?, ?)

проблема в том, что B_C и B_D обнуляются, а B_D - это внешний ключ другой таблицы (объекта).

Таким образом, если исходное значение B_C или B_D равно нулю, sql для удаления станет следующим:

delete from B where B_A=<somevalue> and B_C=null and B_D=null

в DB2, если у вас "= null", DB2 не удаляет строки, в итоге вторая вставка в запрос завершится неудачно. но в моем приложении я должен поставить значение NULL в качестве значения для B_C или B_D, поэтому я бы хотел, чтобы hibernate генерировал запросы следующим образом:

delete from B where B_A=? and (B_C is null or B_C=?) and (B_D is null or B_D=?)

есть ли способ сделать это?

Пожалуйста, помогите. большое спасибо.

1 Ответ

2 голосов
/ 22 февраля 2011

Почему вы не нормализуете свою схему, не сделаете B самостоятельной сущностью, не добавите суррогатный первичный ключ в B и не создадите отношения OneToMany между A и B?

Это было бы намного эффективнее (не нужно удалять все и вставлять каждый раз при обновлении коллекции), и у вас больше не будет этих проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...