Заставить EclipseLink использовать дискриминаторный столбец в операторе удаления - PullRequest
0 голосов
/ 11 января 2012

Я использую JPA / EclipseLink.Я определил суперкласс с именем Parameter

@Entity
@Table(name="parameter")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING,length=64)
@DiscriminatorValue(value="fr.itce.babel.entity.Parameter")
public class Parameter {
    @Id
    String code;

    String value;
...
}

и двумя другими объектами, наследующими

@Entity
@DiscriminatorValue(value="fr.itce.babel.entity.Line")
public class Line extends Parameter {

}

@Entity
@DiscriminatorValue(value="fr.itce.babel.entity.Phase")
public class Phase extends Parameter {

}

Когда я выбираю все строки, генерируется запрос

select code, value from parameter where type = ?

с type = 'fr.itce.babel.entity.Line'

Это работает для меня.

Но при удалении объекта Line я получаю что-то вроде этого

delete from parameter where code = ?

Тьфу ... он не использует столбец дискриминатора и поэтому удаляет все сущности с одинаковым событием кода, если это Фаза ...

Как я могу принудительно использовать столбец дискриминаторав моем запросе на удаление?

Ответы [ 2 ]

1 голос
/ 16 января 2012

код является идентификатором, и уникальным, поэтому не должно быть проблемы?

Вы можете принудительно включить тип, используя пользовательский deleteQuery в DescriptorQueryManager, используя DescriptorCustomizer, но я не вижу причины для этого, поскольку код является идентификатором. Вы также можете использовать оптимистическую блокировку (@Version), если вы обеспокоены тем, что пользователи удаляют неправильный объект.

0 голосов
/ 11 января 2012

Эти объекты находятся в одной таблице, где ключевой столбец - код .Поскольку это ключ, он уникален и нет возможности иметь более одного объекта с одинаковым значением code .EclipseLink знает о типе сущности, поэтому нет необходимости иметь дискриминатор в операторе удаления.

...