Мне нужно добавить soft delete Функция для всех объектов, которыми управляет мое приложение. Для того, чтобы выполнить, что я создал базовый класс сущностей (MappedSuperclass) с удалено поля, как показано ниже:Правильное использование псевдонимов таблицы в Hibernate Interceptor
@MappedSuperclass
public abstract class BaseVersionableEntity {
@Id
@Basic(optional = false)
@NotNull
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID", nullable = false)
protected Long id;
@Version
@Column(name = "VERSION", nullable = false)
protected Long version;
@Basic
@Column(name = "DELETED")
protected boolean deleted;
public boolean isDeleted() {
return deleted;
}
public void setDeleted(boolean deleted) {
this.deleted = deleted;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
// equals/hashCode
}
С помощью перехватчика механизма Hibernate, я настроил мягкого удаление перехватчика, чтобы поймать все запросы что спящий режим выполняет:
public class SoftSelectInterceptor extends EmptyInterceptor{
private static final long serialVersionUID = 1L;
@Override
public String onPrepareStatement(String sql) {
if(sql.startsWith("select")){
sql = sql.replace("where ","where deleted=0 and ");
}
return super.onPrepareStatement(sql);
}
}
Я добавил ниже перехватчик конфигурации для persistence.xml файла
<property name="hibernate.ejb.interceptor" value="com.my.organization.SoftSelectInterceptor"/>
Обратите внимание, что есть SoftDeleteInterceptor, а также. Работает одинаково.
Когда я выполняю этот код Hibernate уловы выберите вызовы заявления в onPeraparedStatement метода, но он добавляет псевдоним таблицы перед полой таблицей. То есть, если имя таблицы reportTemplate, hibernate дать эту таблицу reportTemplate0 псевдоним. Поэтому мой оператор замены должен быть следующим:
sql = sql.replace("where ","where reportTemplate0.deleted=0 and ");
Я могу разобрать строку sql и попытаться вывести правильные псевдонимы таблиц. Однако в сложных sql-операциях (когда один и тот же объект использовался несколько раз) было бы трудно сделать вывод.
Интересно, есть ли лучший способ сделать это.
вариант 1 и 3 не применяются в нашем случае, так как я должен дать общее решение с минимальным эффектом. Я рассматриваю вариант 2. Существует ли какой-либо глобальный параметр конфигурации для указания структуры табличных псевдонимов. Например, использовать префикс t (например, t1, t2) или использовать префикс имени класса сущностей alwayse и т. Д.? –
Для псевдонимов нет конкретных параметров конфигурации. Обычно это _Entity Name_ + _a counter_ + '_' (см.' Org.hibernate.hql.ast.util.AliasGenerator.createName (String) '), но я не могу гарантировать это для всех сгенерированных SQL. В документации говорится, что _Subclasses of Loader do * not * должны использовать псевдонимы этой формы_ –
. Я принял ваш ответ, так как опция 1 всегда применима, если мы не принимаем во внимание усилия. последний вопрос: Hibernate поддерживает аннотацию фильтра в MappedSupperClasses (начиная с версии 3.5.0). что, если бы я использовал только один фильтр в сопоставленном суперклассе и применял все сущности в проекте, наследует этот суперкласс. Есть ли недостатки такого подхода? –