2013-10-08 2 views
3

Я использую @SqlResultSetMapping для @Entity, который является чисто доступным только для чтения (и в базе данных нет базы данных). Я загружаю десятки тысяч из них в память, поэтому мне нужно отделить объекты от EntityManager, чтобы избежать проверки грязной сущности Hibernate, когда я буду работать позже.Могу ли я автоматически отключить SqlResultSetMapping Entity от EntityManager?

Есть ли способ аннотировать объект Entity или SqlResultSetMapping, чтобы сущности никогда не добавлялись в EntityManager?

Non-PERSISTED лицо:

@SqlResultSetMapping(name = "fooMapping", entities = @EntityResult(entityClass = Foo.class)) 
@Entity 
public class Foo { 
    @Id 
    public Long row_id; 
    public String name; 
} 

Родной запрос:

String sql = "SELECT id AS row_id, friendlyName AS name FROM SomeTable"; 
Query q = JPA.em().createNativeQuery(sql, "fooMapping"); 
List<Foo> fooList = q.getResultList(); 

Текущее решение:

for (Foo f : fooList) { 
    JPA.em().detach(f); // 100x improvement for subsequent DB work 
} 

// subsequent database work 

ответ

2

Один из способов избежать грязной проверки, чтобы указать в спящем режиме, что запрос выбирает объекты только для чтения. Вы можете сделать это в JPA, используя query hints

q.setHint("org.hibernate.readOnly",true); 

От hibernate doc:

org.hibernate.readOnly: Объекты, извлекаемые этим запросом будет загружен в режиме только для чтения, где Hibernate будет никогда не грязно-проверяйте их или не делайте изменения постоянными (например, новый Boolean (true)), по умолчанию false

+0

Я думаю, что это достаточно безопасно, потому что другим программистам легко следовать на примере. Профилирование предполагает, что он эффективен как 'for (Foo f: fooList) {JPA.em(). Detach (f); } '. –

Смежные вопросы