Ignorando acentuação no Hibernate Search

hibernate

opa Pessoal,

Esses dias precisei fazer uma implementação com o Hibernate Search e passei aperto, pois precisava que acentuação fosse ignorado durante a pesquisa, iai ?

lets go…
Problema

É rapaz, parece que é trivial, mas nem tanto como é no Criteria. Olhando a documentação e fazendo uma pesquisa no velho Google acahei a solução, para que o Hibernate Search ignore acentuação durante as pesquisas.
Solução

O resultado é bem simples, apenas precisamos definir as seguintes anotações na classe de pesquisa veja:

@AnalyzerDef(name = "customAnalyzer",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = ASCIIFoldingFilterFactory.class),
@TokenFilterDef(factory = SnowballPorterFilterFactory.class)
})
public class Professor{

}

E já ignora maiusculo/minusculo também.

Vou ficando por aqui e espero que tenham gostado do post de hoje.

abraços, see ya!!

Acessando atributos de outras classes no Hibernate search

hibernate

Olá Pessoal,

O post de hoje é bem simples, recentemente passei por um problema em como acessar os atributos de outra classe atraves do hibernate search.

Let go..
Problema

Você tem a classe Carro e essa classe tem um objeto Motor e vc precisa acessar o atributo versao que está na classe Motor. Como fazer isso com hibernate search? Parece que é simples né? Nem tanto gastei algumas horas até saber como fazer.
Solução

Vamos lá, você vai precisar na classe Carro fazer isso:

@Indexed
class Carro{

@IndexedEmbedded
private Motor motor;

}

E na classe Motor isso:

@Indexed
class Motor{

@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO) 
@ContainedIn
private String versao;
}

Agora na sua busca ficará assim:

QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Professor.class).get();

Query query = queryBuilder.keyword().onFields( "motor.nome")
.matching(descricao).createQuery();

FullTextQuery hibQuery = fullTextSession.createFullTextQuery(query, Carro.class, Motor.class);

Observe que o pulo do gato “motor.nome”.

Resolvido.

abraço, see ya!!!

Resolvendo LazyInitializationException em 5 minutos

Olá Pessoal,

No post de hoje vamos ver como podemos resolver o LazyInitializationException em 5 minutos. Dificilmente um desenvolvedor não passou por essa exceção. Não vou entrar em detalhes sobre o motivo  da exceção LazyInitializationException, até por que já falei em um post aqui no blog, usando a solução com filter.

Lets go…

Na prática

Para mostrar a solução na prática, vou pegar um exemplo simples. Vamos considerar o relacionamento de que um Type  tem muitos Users, veja

@Entity

@Table(name = “type”)

public class Type implements java.io.Serializable { 

private static final long serialVersionUID = 2644022136811709451L; 

private Long id;

private String description;

private Set<User> users = new HashSet<User>(); 

public Type() {

}

@Id

@GeneratedValue

@Column(name = “ID”, unique = true, nullable = false)

public Long getId() {

return this.id;

}

@OneToMany(fetch = FetchType.LAZY, mappedBy = “type”,  targetEntity=User.class)

public Set<User> getUsers() {

return this.users;

}

//getters/setters omitidos

}

User.java

@Entity

@Table(name = “user”, uniqueConstraints = @UniqueConstraint(columnNames = “EMAIL”))

public class User implements java.io.Serializable,Comparable<User> { 

private static final long serialVersionUID = 9108778602728711429L; 

//declaração de variaveis omitidas 

@ManyToOne(fetch = FetchType.LAZY)

@JoinColumn(name = “TYPE_ID”,nullable=false)

public Type getType() {

return this.type;

}

//getters/setters omitidos

} 

Nada de especial até aqui, apenas o relacionamento que já conhecemos.

O problema

Agora que temos o problema, quando o User.java tentar acessar o Type e a conexão já foi fechada, já sabemos que vamos resolver LazyInitializationException. Uma forma para resolver é usando  join fetch, que evitará o problema pelo seguinte motivo:

– Apenas uma consulta será feita e evitamos o problema N + 1;

– A realização da consulta vai deixar de ser Lazy para Eager. Isso é diferente de você mudar de Lazy para Eager.

No DAO

Devemos ter a consulta assim:

public class UserDAO{

public List<User> readAll() {

                //avoiding LazyInitializationException join fetch

                String hql = “select u from User u join fetch u.type”;

                Query query = getCurrentSession().createQuery(hql);

                return query.list();

        }

}

Pronto. Resolvido seu problema com LazyInitializationException. Mas um detalhe importante é que para cada coleção que temos, é uma consulta que devemos ter. Se Type tem uma coleção de acesso, é uma consulta.

Bom é isso. Vou ficando por aqui e espero que tenham gostado do post.

Abraços, see ya!! 

Troubleshooting PersistenceExceptionTranslationInterceptor Spring

 

Olá Pessoal,

O troubleshooting de hoje é para qume está sobrendo com o Hibernate e Spring.  Vamos ver os erros e como podemos resolver. 

Caused by: java.lang.IllegalStateException: No persistence exception translators found in bean factory. Cannot perform exception translation.

                at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators

Esse erro acontece normalmente quando estamos usando a versão do Hibernate 4 no Spring, porém usando as configurações do Hibernate 3. A resolução é simples, veja:

No hibernate 3 usamos o translation assim:

<bean class=”org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor”/>

No Hibernate 4.x deve ser assim:

<bean class=”org.springframework.orm.hibernate4.HibernateExceptionTranslator”/>

O sessionFactory também deve ser alterado, veja:

No Hibernate 3 é assim:

<bean id=”sessionFactory” class=”org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean”>

Mas no Hibernate 4 deve ser assim:

<bean id=”sessionFactory” class=”org.springframework.orm.hibernate4.LocalSessionFactoryBean”>

Pronto! Assim resolvemos a exception de translation com Hibernate. Fiquem espertos com esses detalhes para não gastar tanto tempo.

Abracos, see ya!!

Troubleshooting: Maven HSQLDB Exception Hibernate 4

 

Olá pessoal,

O troubleshooting de hoje é bem simples, pelo menos nesse aqui não levei mais que 20 min para achar a solução. Migrando de Hibernate 3.x para  4.x  tive um problema com os testes que rodam com HSQLDB ao executar mvn test. Vamos ver o problema.

Lets go…

O problema

Ao executar os testes localmente fora do maven pelo Eclipse, funcionava normalmente, claro tinham as libs corretas no meu classpath, mas ao rodar pelo maven, os testes que usavam HSQLDB falhavam e com a seguinte exceção:

org.hibernate.exception.GenericJDBCException: This function is not supported

Caused by: java.sql.SQLException: This function is not supported

 

O motivo

A dependência para o HSQLDB deve ser:

<dependency>

<groupId>org.hsqldb</groupId>

<artifactId>hsqldb</artifactId>

<version>2.2.8</version>

</dependency>

 

Porém é comum declararmos:

<dependency>

<groupId>hsqldb</groupId>

<artifactId>hsqldb</artifactId>

<version>1.8.0.10</version>

</dependency>

 

Não use essa última, pois ela não dá suporte ao Hibernate 4. Não cheguei a testar se no Hibernate 3 há o mesmo problema.

Feita a alteração, rode mvn test e veja que seus testes passarão normalmente.

É isso ai, vivendo e aprendendo. Vou ficando por aqui…

Abraços, see ya!!