segunda-feira, 24 de setembro de 2012

Dividir a área de trabalho do vim

para dividir verticalmente
:vsplit nome do arquivo

para dividir horizontalmente
:split nome do arquivo

Para mudar o tamanho das colunas 
:vertical res +/- numero de colunas

para mudar o numero das linhas
:res +/- numero de linhas

para alternar entre as janelas 
+ ww

quinta-feira, 20 de setembro de 2012

Recuperar o nome da tabela a qual pertence uma constraint


SELECT ac.constraint_name ,
acc.table_name
FROM all_constraints ac ,
all_cons_columns acc
WHERE ac.constraint_name = 'SYS_C00134587'
and acc.table_name = ac.table_name

Inclusão de parâmetros em componentes JSF

Para incluir parametros em um componente jsp, e resgatá-los em um listener basta

<h:inputText>
      <f:attribute id="indiceBuscaProdutoItensValores" name="indice" value="#{itensValoresStatus.index}"/>
</ice:inputText>

e para resgatar o valor no java


public void textChangeListener(TextChangeEvent event){
       ...
       Integer index = (Integer) event.getComponent().getAttributes().get("indice");
       ...
}

o importante é que o nome do atributo não seja uma palavra reservada neste caso anteriormente usei index e não conseguia recuperar o valor, então recomendo que seja utilizado nomes em português que não tem erro.


sexta-feira, 14 de setembro de 2012

Tag Object no lugar de um iframe


<!DOCTYPE html>
<html>
<body>

<object id="page" type="text/html"
    data="http://www.google.com.br"
    width="500" height="600">
  <p>Oops! That didn't work...</p>
</object>

</body>
</html>

terça-feira, 11 de setembro de 2012

Merge de resultados do hql em um único objeto



A consulta mais simples possível do Hibernate é a seguinte:
from eg.Cat
Isto simplesmente retornará todas as instâncias da classe eg.Cat. Geralmente não precisamos qualificar o nome da classe, uma vez que o auto-import é o padrão. Por exemplo:
from Cat
Com o objetivo de referir-se ao Cat em outras partes da consulta, você precisará determinar um alias. Por exemplo:
from Cat as cat
Essa consulta atribui um alias a cat para as instâncias de Cat, portanto poderemos usar esse alias mais tarde na consulta. A palavra chave as é opcional. Você também pode escrever assim:
from Cat cat
Classes múltiplas podem ser envolvidas, resultando em um produto cartesiano ou união "cruzada".
from Formula, Parameter
from Formula as form, Parameter as param
É considerada uma boa prática nomear alias de consulta, utilizando uma letra minúscula inicial, consistente com os padrões de nomeação Java para variáveis locais (ex.: domesticCat).
Podemos também atribuir aliases em uma entidade associada, ou mesmo em elementos de uma coleção de valores, usando uma join. Por exemplo:
from Cat as cat
    inner join cat.mate as mate
    left outer join cat.kittens as kitten
from Cat as cat left join cat.mate.kittens as kittens
from Formula form full join form.parameter param
Os tipos de uniões suportados foram inspirados no ANSI SQL:
  • inner join
  • left outer join
  • right outer join
  • união completa (geralmente não é útil)
As construções inteirounião esquerda externa e união direita externa podem ser abreviadas.
from Cat as cat
    join cat.mate as mate
    left join cat.kittens as kitten
Você pode fornecer condições extras de união usando a palavra chave do HQL with.
from Cat as cat
    left join cat.kittens as kitten
        with kitten.bodyWeight 
> 10.0
A "fetch" join allows associations or collections of values to be initialized along with their parent objects using a single select. This is particularly useful in the case of a collection. It effectively overrides the outer join and lazy declarations of the mapping file for associations and collections. See Seção 20.1, “Estratégias de Busca ” for more information.
from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens
Geralmente, uma união de busca não precisa atribuir um alias, pois o objeto associado não deve ser usado na cláusula where (ou em qualquer outra cláusula). Também, os objetos associados não são retornados diretamente nos resultados da consulta. Ao invés disso, eles devem ser acessados usando o objeto pai. A única razão pela qual precisariamos de um alias é quando fazemos uma união de busca recursivamente em uma coleção adicional:
from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens child
    left join fetch child.kittens
Observe que a construção busca não deve ser usada em consultas invocadas usando iterate() (embora possa ser usado com scroll()). O Fetch também não deve ser usado junto com o setMaxResults() ou setFirstResult() pois essas operações são baseadas nas linhas retornadas, que normalmente contém duplicidade devido à busca das coleções, então o número de linhas pode não ser o que você espera. A Fetch não deve ser usada junto com uma condição with. É possível que seja criado um produto cartesiano pela busca de união em mais do que uma coleção em uma consulta, então tome cuidado nesses casos. Uma busca de união em várias coleções pode trazer resultados inesperados para mapeamentos do tipo bag, tome cuidado na hora de formular consultas como essas. Finalmente, observe o seguinte, abusca de união completa e busca de união direita não são importantes.
Se estiver usando o nível de propriedade busca lazy (com instrumentação de bytecode), é possível forçar o Hibernate a buscar as propriedades lazy imediatamente na primeira consulta, usando buscar todas as propriedades .
from Document fetch all properties order by name
from Document doc fetch all properties where lower(doc.name) like '%cats%'


Fonte: http://docs.jboss.org/hibernate/orm/3.5/reference/pt-BR/html/queryhql.html


Uma estratégia de busca é a estratégia que o Hibernate irá usar para recuperar objetos associados se a aplicação precisar navegar pela associação. Estratégias de Busca podem ser declaradas nos metadados de mapeamento O/R, ou sobrescritos por uma consulta HQL ou consulta com Criteria.
Hibernate3 define as seguintes estratégias de busca:
  • Join fetching - o Hibernate busca o objeto ou coleção associada no mesmo SELECT, usando um OUTER JOIN.
  • Select fetching - um segundo SELECT é usado para buscar a entidade ou coleção associada. A menos que você desabilite a busca lazy, especificando lazy="false", esse segundo SELECT será executado apenas quando você acessar a associação.
  • Subselect fetching - um segundo SELECT será usado para recuperar as coleções associadas de todas as entidades recuperadas em uma consulta ou busca anterior. A menos que você desabilite a busca lazy especificandolazy="false", esse segundo SELECT será executado apenas quando você acessar a associação.
  • Batch fetching - uma opção de otimização para selecionar a busca. O Hibernate recupera um lote de instâncias ou entidades usando um único SELECT, especificando uma lista de chaves primárias ou chaves externas.
O Hibernate distingue também entre:
  • Immediate fetching - uma associação, coleção ou função é imediatamente recuperada, quando o proprietário for carregado.
  • Lazy collection fetching - a coleção é recuperada quando a aplicação invoca uma operação sobre aquela coleção. Esse é o padrão para coleções.
  • "Extra-lazy" collection fetching - elementos individuais de uma coleção são acessados a partir do banco de dados quando necessário. O Hibernate tenta não buscar a coleção inteira dentro da memória a menos que seja absolutamente necessário. Isto é indicado para coleções muito grandes.
  • Proxy fetching: uma associação de um valor é carregada quando um método diferente do getter do identificador é invocado sobre o objeto associado.
  • "No-proxy" fetching - uma associação de um único valor é recuperada quando a variável da instância é acessada. Comparada à busca proxy, esse método é menos preguiçoso (lazy); a associação é buscada até mesmo quando somente o identificador é acessado. Ela é mais transparente, já que não há proxies visíveis para a aplicação. Esse método requer instrumentação de bytecodes em build-time e é raramente necessário.
  • Lazy attribute fetching: um atributo ou associação de um valor é buscado quanto a varíavel da instância é acessada. Esse método requer instrumentação de bytecodes em build-time e é raramente necessário.
Nós temos aqui duas noções ortogonais: quando a associação é buscada e como ela é buscada. É importante que você não os confuda. Nós usamos fetch para ajustar o desempenho. Podemos usar lazy para definir um contrato para qual dado é sempre disponível em qualquer instância desconectada de uma classe particular.


HQL: Fetch Join Collections from Eager Table


O segredo é :

SELECT e FROM Escola e JOIN FETCH e.aulas a;

para que o FETCH funcione é necessário que todos os relacionamentos sejam declarados na clausula  FROM e que um único objeto seja especificado na clausula SELECT

No exemplo acima o objeto Escola possui uma Collection de Aula, sendo assim eu quero que os resultados sejam resolvidos em uma única consulta, então defino o label "e" que representa a Escola no select e no FROM defino os relacionamentos com a clausula FETCH após os joins.

Com isso em uma única consulta o objeto será preenchido.



quarta-feira, 5 de setembro de 2012

Replicação de sessões HTTP no JBoss

Quando trabalhamos com aplicações web é muito comum salvar dados nas sessões dos usuários. No caso que estejamos trabalhando também com cluster, a melhor opção na maioria das vezes é replicar as sessões em todas as instancias do nosso servidor de modo que os usuários possam se conetar em qualquer nodo do cluster e a sessão este disponível para eles em tudo momento.
Talvez tenham se perguntado: qual é a outro opção? Bom, a outra opção e utilizar “sticky sessions”, de modo que o balanceador sempre se conete com o mesmo membro do cluster, o qual possui a sessão do usuário. O ruim das sticky sessions é que ao cair algum nodo do cluster, os dados que se encontravam neles serão perdidos dado que não foram replicados.
Nesse artigo vamos configurar nossa aplicação web para que o JBoss 4.2.2.GA replique a sessão HTTP ao longo de todos os nodos do cluster cade vez que ela sofrer alguma alteração. A configuração é realizada no JBoss Web que utiliza o Tomcat, pelo que a configuração num Tomcat independente não deveria fugir muito do que ira ser mostrado aqui.
Mãos na obra
A configuração é bem simples, são necessários somente dois passos.
O primeiro passo é indicar que nossa aplicação é distribuída. Possivelmente esta configuração já foi feita devido a que estamos supondo que a aplicação já foi configurada para rodar num cluster. De qualquer modo, a configuração é realizada no arquivo web.xml da aplicação; devemos inserir o seguinte trecho dentro do nodo web-app:
<distributable />
O segundo e último passo é configurar um arquivo chamado jboss-web.xml, que sera localizado na pasta WEB-INF. Esse arquivo indicara ao JBoss como e quando replicar a sessão da aplicação:
<jboss-web>
    
<replication-config>
        
<replication-trigger>SET</replication-trigger>
        
<replication-granularity>SESSION</replication-granularity>
    
</replication-config>
</jboss-web>
O nodo replication-trigger indica quando o JBoss deve replicar os dados. Nesse caso estamos indicando que os dados devem ser replicados cada vez que seja chamado o método setAttribute da sessão (HttpSession).
O nodo replication-granularity indica o que devera ser replicado. Se a sessão não for muito grande, SESSION é uma boa opção porque sera replicada a sessão inteira. Quando a sessão é grande demais, a opção ATTRIBUTE resulta num ganho de performance devido a que somente serão replicados os atributos da sessão que sofreram alteração.
Testando a configuração
Fiz uma aplicação web bem simples para poder testar e comprovar que o JBoss esta replicando os dados da sessão dela. A aplicação guarda na sessão o número de acesos e printa o valor na tela. Cada vez que acessarmos a aplicação, deveria aparecer quantas vezes realizamos a operação, independente de qual nodo do cluster o balanceador escolher para servir.
A aplicação pode ser descarregada de aqui .
Para finalizar, agora o blog possui uma pagina de contato. Qualquer duvida ou pergunta que não quiserem colocar nos comentários pode ser enviada mediante o formulário e eu responderei assim chegar na minha caixa de email.

Fonte: http://www.mouseoverstudio.com/blog/2008/06/20/replicacao-de-sessoes-http-no-jboss/