Usando Sequence no ADF

Tweet about this on TwitterShare on Facebook9Share on LinkedIn9Share on Google+0

Em alguns bancos de dados, como o MySQL, você tem a opção de auto-incremento para gerar um número único quando você adiciona uma nova linha. Isto é útil para criar um número único que irá atuar como chave primária. No banco de dados Oracle, você não tem auto-incremento, mas você tem Sequences. Uma Sequence é um objeto que é usado para gerar uma sequência de números.

Há três abordagens para executar Sequences no ADF: Substituir o Entity Object Row Base Class, usar expressão Groovy ou usar DBSequence + Trigger. Neste post você vai aprender todas elas. Faça o download do aplicativo de exemplo: ADFDBSequenceApp.zip.

DBSequence + Trigger

Antes de tudo, você precisa criar a Trigger que executa antes de uma instrução INSERT.
Essa Trigger executa a Sequence e atribui o valor na coluna de chave primária.

CREATE OR REPLACE TRIGGER ASSIGN_DEPARTMENT_ID
BEFORE INSERT ON DEPARTMENTS FOR EACH ROW
BEGIN
  IF :NEW.DEPARTMENT_ID IS NULL OR :NEW.DEPARTMENT_ID < 0 THEN
    SELECT DEPARTMENTS_SEQ.NEXTVAL INTO :NEW.DEPARTMENT_ID FROM DUAL;
  END IF;
END;

Na janela Applications, clique duas vezes no Departments Entity Object.
No editor Overview, clique na guia de navegação Attributes.
Na página Attributes, selecione o atributo DepartmentId e altere o seu tipo para DBSequence.

using-database-sequence-in-adf1

Salve tudo e execute o Oracle ADF Model Tester.
Clique duas vezes no nó DepartmentsView1 e adicione um novo departamento.

using-database-sequence-in-adf2

Um número negativo é atribuído ao DepartmentId como o seu valor temporário.
Este valor funciona como a chave primária durante a operação em que ele é criado.
Quando você confirma a transação, o valor do atributo muda.

using-database-sequence-in-adf3

Substituir o Entity Object Row Base Class

Para criar uma classe Java que irá centralizar o código para recuperar a chave primária, vá até a janela Applications, clique com o botão direito no projeto Model e selecione New > From Gallery.
Em New Gallery, escolha General > Java > Class e clique em OK.
Na caixa de diálogo Create Java Class, especifique os seguintes valores e clique em OK.

  • Name: CustomEntityImpl
  • Package: br.com.waslleysouza.model.adfbc.base
  • Extends: oracle.jbo.server.EntityImpl

using-database-sequence-in-adf4

Substitua o conteúdo de classe Java com o seguinte código:

package br.com.waslleysouza.model.adfbc.base;

import oracle.jbo.AttributeDef;
import oracle.jbo.AttributeList;
import oracle.jbo.server.EntityImpl;
import oracle.jbo.server.SequenceImpl;

public class CustomEntityImpl extends EntityImpl {
  protected void create(AttributeList attributeList) {
    super.create(attributeList);
    for (AttributeDef def : getEntityDef().getAttributeDefs()) {
      String sequenceName = (String) def.getProperty("SequenceName");
      if (sequenceName != null) {
        SequenceImpl s = new SequenceImpl(sequenceName, getDBTransaction());
        setAttribute(def.getIndex(), s.getSequenceNumber());
      }
    }
  }
}

using-database-sequence-in-adf5

Para substituir o Entity Object Row Base Class, vá até a janela Applications, e clique duas vezes no Locations Entity Object.
Clique na guia de navegação Java e, em seguida, clique no botão Edit Java Classes.
Na caixa de diálogo Select Java Options, clique em Classes Extend.
Na caixa de diálogo Override Base Classes, substitua o conteúdo do campo Row:

br.com.waslleysouza.model.adfbc.base.CustomEntityImpl

using-database-sequence-in-adf6

Clique na aba de navegação Attributes e selecione o atributo LocationId.
Na guia Custom Properties, clique no ícone Adicionar > Non-translatable Property.
Crie a propriedade SequenceName com LOCATIONS_SEQ como valor.

using-database-sequence-in-adf7

Salve tudo e execute o Oracle ADF Model Tester.
Clique duas vezes no nó LocationsView1 e adicione um novo local.
A Sequence foi executada e o número foi atribuído ao campo LocationId.

using-database-sequence-in-adf8

Expressão Groovy

Na janela Applications, clique duas vezes no Employees Entity Object.
Clique na guia de navegação Attributes e selecione o atributo EmployeeId.
Na guia Detalhes, altere o Default Value para Expression e adicione o seguinte código:

(new oracle.jbo.server.SequenceImpl("EMPLOYEES_SEQ", adf.object.getDBTransaction())).getSequenceNumber()

using-database-sequence-in-adf9

Em vez de replicar código, você pode criar um método auxiliar em EntityImpl.

protected oracle.jbo.domain.Number nextVal(String sequenceName) {
  SequenceImpl s = new SequenceImpl(sequenceName,getDBTransaction());
  return s.getSequenceNumber();
}

using-database-sequence-in-adf10

Então, a expressão Groovy pode ser apenas:

adf.object.nextVal("EMPLOYEES_SEQ")

using-database-sequence-in-adf11

using-database-sequence-in-adf12

JDeveloper 12.1.3 e ADF introduziram um modelo de segurança para expressões ADF BC Groovy. Para evitar a exceção JBO-25152 (https://java.net/jira/browse/ADFEMG-241), é preciso mudar o valor do trustMode.
No editor Source, selecione o trustMode="untrusted" e mude para "<default> (trusted)".

using-database-sequence-in-adf13

using-database-sequence-in-adf14

Salve tudo e execute o Oracle ADF Model Tester.
Clique duas vezes no nó EmployeesView1 e adicione um novo funcionário.
A Sequence foi executada e o número foi atribuído ao campo EmployeeId.

using-database-sequence-in-adf15

Tweet about this on TwitterShare on Facebook9Share on LinkedIn9Share on Google+0

Autor: Waslley Souza

Consultor Oracle com foco em tecnologias Oracle Fusion Middleware e SOA. Certificado Oracle WebCenter Portal, Oracle ADF e Java.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *