2014-02-28 1 views
0

Я использую Java, Hibernate, Spring Data и довольно новичок в этой технологии. Мне нужно выяснить, как пропускать строки, отмеченные как «архивированные». У нас есть строгое указание от нашего архитектора БД, что никакие строки не должны удаляться из базы данных.Запуск по умолчанию по умолчанию для пропуска строк с определенными значениями

@MappedSuperclass 
public class AbstractEntity implements Identifiable<String> { 

    @Id 
    @GeneratedValue(generator="system-uuid") 
    @GenericGenerator(name="system-uuid", strategy="uuid") 
    private String id; 

    private boolean archived; //<----? 
} 

@Entity 
public class Employee extends AbstractEntity {   
    private String title; 
    private String fullName; 
    @ManyToOne 
    private Department dept; 
} 

@Entity 
public class Department extends AbstractEntity {   
    private String name;  
} 

В приведенном выше примере любой класс, расширяющий AbstractEntity, никогда не должен возвращать строки, которые заархивировали == true. Все мои классы домена будут расширяться AbstractEntity, поэтому Я бы хотел, чтобы решение было реализовано в AbstractEntity.java или в некоторой глобальной конфигурации, так что все сгенерированные вызовы SQL равны 'где [таблица] .archived <> true'

ответ

0

Посмотрите на Hibernate Filters.

@FilterDef(name="activeOnly") 
@Filter(name="activeOnly", condition= "archived <> 1") 
// assumes that all tables have a numeric column "archived" 
// as you can notice, this is a filter at the SQL Level 
// (not at the Entity level) 
@MappedSuperclass 
public class AbstractEntity // .... 

Я никогда не использовал Spring Data, но Adding custom behavior to all repositories часть официальной документации приведет меня к belieave, что это довольно легко получить впрыскивается EntityManager и настроить его поведение. Просто разверните его и включите фильтр.

Session session = entityManager.unwrap(Session.class); 
session.enableFilter("activeOnly"); 

Если вы хотите, чтобы фильтр можно применять для всех подклассов @MappedSuperclass использования последней версии Hibernate. Это поддерживает только версия 3.5 и выше (см. HHH-4332).

Кроме того, есть один ключ, вам может потребоваться повторить фильтр на ассоциациях (см. Hibernate Filters on related table with MappedSuperClass).


Если вы хотите настроить операции удаления, а также, использовать @SQLDelete отметить archived = 1 (см Soft deletes using Hibernate annotations). Но, насколько мне известно, это работает только на сопоставленных объектах (ничего не может быть сделано на уровне @MappedSuperclass)