BISDAO Legacy: mudanças entre as edições
Sem resumo de edição |
mSem resumo de edição |
||
Linha 88: | Linha 88: | ||
//Ordenando por uma coluna de for descendente | //Ordenando por uma coluna de for descendente | ||
BISOrderBy.getBISOrderbyInstance(AbbreviationMO.ORDERBY_PRIORITY, false) | BISOrderBy.getBISOrderbyInstance(AbbreviationMO.ORDERBY_PRIORITY, false); | ||
//Ordenando por duas colunas | //Ordenando por duas colunas | ||
BISOrderBy.getBISOrderbyInstance(AbbreviationMO.ORDERBY_PRIORITY, false).addOrderbyItem(AbbreviationMO.ORDERBY_OCCURENCE) | BISOrderBy.getBISOrderbyInstance(AbbreviationMO.ORDERBY_PRIORITY, false).addOrderbyItem(AbbreviationMO.ORDERBY_OCCURENCE); | ||
</syntaxhighlight>}} | </syntaxhighlight>}} |
Edição das 00h50min de 20 de março de 2015
O BISCore oferece uma estrutura de persistência combinada com os recursos da JPA para simplificar a camada de persistência dos módulos. Essa estrutura prevê métodos para insert, update, delete e "find".
Para utilizar esta estrutura há algumas condições:
- O objeto a ser persistido deve estender BISDefaultVO.
- Para cada objeto a ser persistido, deve haver um MO correspondente, mesmo que sem qualquer atributo (classe vazia).
- A classe de persistência deve estender BISDefaultEJB3DAO. Esta classe utiliza 'generics', e recebe como parâmetro as classes de VO e MO do objeto a ser persistido.
- Deve ser Implementada uma interface deste DAO que por sua vez deve estender BISDefaultDAO.
- Implementar o método no Factory do Plugin para retornar o objeto que implementa a interface do DAO.
![]() |
|
Para exemplificar, imaginemos que o objeto em questão seja um "contato". Obviamente devemos ter o VO que o representa, se o objeto for batizado como "Contact" o nome do VO será ContactVO. Assim, para implementar a camada de persistência deste objeto devemos criar as seguintes classes e intarface:
- ContactMO: é o MatchObject utilizado nos métodos de busca automatizados do objeto. Este Objeto não precisa ter nenhum método, atributo ou construtor no seu interior a princípio. Seus atributos e métodos só precisam ser criados posteriormente de acordo com a necessidade de se realizar buscas do objeto.
![]() |
ContactMO
public class ContactMO extends BISDefaultMO {
}
|
- ContactDAO: é uma interface que deve extender BISDefaultDAO, preenchendo seus generics com os MO e VO. Esta interface tem o objeto de separar e permitir que outras implementações de persistência funcionem de forma transparente, caso não se deseje mais utilizar o padrão EJB3DAO fornecido pelo BISCore (ou mesmo outro sistema de persistência fornecido pelo BISCore). Esta classe também não precisa ter conteúdo algum, já que sua implementação é herdada das classes do BISCore. Só terá implementação extra em objetos complexos ou que precisem de algum tipo de métodos para melhor performance ou execução de funções específicas.
![]() |
ContactDAO
public interface ContactDAO extends BISDefaultDAO<ContactVO, ContactMO> {
}
|
- ContactEJB3DAO: Esta classe e a implementação da persistência usando o modelo EJB3DAO do BISCore. Assim como as outras classes não precisa ter nenhum conteúdo especial uma vez que todo o código já está implementado nas classes do BISCore. Mas criar a classe, implementa a interface definida acima e suprir os generics necessários.
![]() |
ContactEJB3DAO
public class ContactEJB3DAO extends BISDefaultEJB3DAO<ContactVO, ContactMO> implements ContactDAO {
}
|
- <ModuleName>DAOFactory: Esta classe deve ser implementada apenas uma vez no módulo, por isso não usa o nome do objeto e sim o nome do módulo. Esta classe deve ter um método implementado para criar os DAOs do objeto e retorna-lo de acordo com o sistema de persistência usado no sistema.
![]() |
Método de <ModuleName>DAOFactory
public static AbbreviationDAO getAbbreviationDAO() throws BISCriticalException {
if (DAOTYPE.EJB3HIB.equals(getDaotype())) {
return new AbbreviationEJB3DAO();
} else {
throw getUnsuportedDAOException();
}
}
|
![]() |
|
![]() |
|
Uma vez que toda a estrutura esteja implementada, basta usar a Factory para obter a implementação correta do DAO (que será retornada apenas pela interface geral) e usar os métodos conforme descritos no JavaDoc do BISCore.
DAOFactory
A DAOFactory é uma a implementação do pattern Factory para a separação da camada de persistência da camada de lógica da aplicação. O pattern Factory obriga que uma única classe, aqui chamada com o sufixo Factory, implemente métodos que criem e retornem objetos identificados apenas por uma interface. Neste caso, nossa Factory é a DAOFactory, e seus métodos devem devolver as implementações dos DAOs de cada objeto de acordo com o tipo de persistência sendo utilizada. Por isso, só utilizamos uma única Factory por módulo. Esta factory terá um método para cada DAO criado no módulo. Cada DAO deve ser separado sempre em uma interface e uma ou mais implementações de acordo com a quantidade de modos de persistência que o módulo suportar.
A classe de DAOFactory da cada módulo deve ter o nome do módulo e o sufixo DAOFactory. Devem extender a classe BISDefaultDAOFactory para herdar os métodos que informam o tipo de persistência sendo usado pelo sistema. Uma DAOFactory implementada ficaria como o código abaixo:
![]() |
<ModuleName>DAOFactory
public final class BISCoreDAOFactory extends BISDefaultDAOFactory {
//Métodos de getDAO() para retornar o DAO de cada objeto do módulo como mostrado na sessão anterior.
}
|
BISOrderBy
O BISOrderBy é o objeto usado em conjunto com os MOs pela camada de persistência do BISCore para definir a ordem que os objetos devem ser retornados ao utilizarmos os métodos de find. Para criar o BISOrderBy é possível de duas maneiras: instanciando o objeto como qualquer outro, ou utilizando os métodos estáticos "getBISOrderbyInstance()". Em ambos os casos é possível passar dois atributos: coluna a ordenar e ascendência / descendência do campo. Por padrão, se passada só o nome da coluna, a ordem será ascendente. O nome da coluna a ser passada é o mesmo nome do atributo do VO.
Por exemplo, se temos um ClientVO, e queremos ordenar pelo atributo "name", devemos criar o BISOrderBy passando a string "name" como parâmetro. Se desejarmos que a ordem da lista seja de Z para A, devemos passar o segundo atributo como "false". Como o valor padrão é sempre true na ordem da lista, não faz sentido passar o segundo atributo para obter uma lista ascendente. É possível organizar uma lista por um atributo que esteja em um sub VO. Por exemplo, imaginando que nosso ClientVO tenha um atributo "address" que carregue um AddressVO, e este tenha um atributo para o nome da rua chamado "street". Para ordenar a lista de clientes por nome da rua, devemos criar um BISOrderBy passando como atributo a string "address.street". Lembrando que o find a ser utilizado é de Client, e não de address.
![]() |
|
Para ordenar por múltiplas colunas, basta chamar os métodos "addOrderbyItem()" e passar os mesmos atributos citados acima, ou um BISOrderBy completo. A ordem em que estes são acrescentados define a prioridade de cada coluna, ou seja, a segunda coluna só será utilizada se houver empate na primeira, a terceira só será usada de houver empate na primeira e segunda, e assim por diante.
![]() |
Criando BISOrderBy
//Ordenando por uma coluna
BISOrderBy.getBISOrderbyInstance(AbbreviationMO.ORDERBY_PRIORITY);
//Ordenando por uma coluna de for descendente
BISOrderBy.getBISOrderbyInstance(AbbreviationMO.ORDERBY_PRIORITY, false);
//Ordenando por duas colunas
BISOrderBy.getBISOrderbyInstance(AbbreviationMO.ORDERBY_PRIORITY, false).addOrderbyItem(AbbreviationMO.ORDERBY_OCCURENCE);
|