JPA Primary Key composto por Foreign Key

Boa tarde,
Criei um mapeamento com uma chave primeira composta por dois campos que são chaves estrangeiras, uma dessas chaves composta é pela entity que estou inserindo e ainda não tenho o código. Segue as classes.
Classe principal que tem uma lista de um objeto que tem chave estrangeira.

@Entity
public class Classe1{
    @Id
    private Long id;
    @OneToMany(mappedBy="classe2",fetch=FetchType.EAGER ,orphanRemoval = true,cascade = CascadeType.ALL)
    private List<Classe2> classe2;
}

Classe que tem chave primaria estrangeira

@Entity
public class Classe2{
        @EmbeddedId
        private ChaveClasse2 id;
        @ManyToOne
	@JoinColumn(name="id", insertable=false, updatable=false)
	private Classe1 classe1;
}

Chave composta estrangeira

@Embeddable
public class ChaveClasse2{
      private Long id;
      private Long id2;
}

Inserindo da maneira a baixo, não é possível salvar pois não consegue ter a chave da Classe1 na hora de criar. Pois ele está mapeado com o JoinColumn. O que eu precisava é do ChaveClasse2 ter o registro após a inserção do Classe1.

Classe1 classe = new Classe1();
Classe2 classe2 = new Classe2();
classe2.setClasse1(classe);
classe.addClasse2(classe2);
em.merge(classe);

A solução encontrada foi alterando a classe Classe2 para ficar dessa maneira:

@Entity
public class Classe2{
        @EmbeddedId
        private ChaveClasse2 id;
        @MapsId("id")
        @ManyToOne
	@JoinColumn(name="id", insertable=false, updatable=false)
	private Classe1 classe1;
}

Adicionando @MapsId(“id”) , onde o paramêtro é o nome do atributo de dentro da ChaveClasse2.

Espero ter ajudado.
Até a próxima.

seja o primeiro a comentar

Join com regra específica

Eu tive um problema, onde eu tenho uma entity com uma lista, mas só me interessa o registro mais atual dela, inclusive preciso de filtrar apenas com a mais atual. No meu caso tem Boleto, do Boleto tem um HistoricoStatus.
Na classe Boleto eu crio uma lista de Historico e anoto com a annotation @Filter

public static final String LATEST_STATUS_FILTER = "latestStatusFilter"; 

@OneToMany
@JoinColumn(name = "COD_BOLETO")
@Filter(name = LATEST_STATUS_FILTER, condition = 
"DTA_ATUALIZACAO = (select max(M.DTA_ATUALIZACAO) 
from HISTORICO_STATUS_BOLETO M where M.COD_BOLETO= COD_BOLETO)")
private List<HistoricoStatusBoleto> historicoList;

Na hora de realizar a consulta precisa de habilitar esse filter, para habilitar basta executar esse trecho.

org.hibernate.Session session = (Session) getEntityManager().getDelegate();
session.enableFilter(Boleto.LATEST_STATUS_FILTER);

Agora na hora de realizar o Join ele adiciona essa clausula no ON do JOIN.

Até mais,

seja o primeiro a comentar

Instalar Maven e aumentar memória

Para instalar o maven basta baixar o link no site da apache: http://maven.apache.org/download.cgi.
Descompacte em um diretório por exemplo no /opt/maven/
adicione as variáveis de ambiente:
Pasta onde descompactou o maven
export M2_HOME=/opt/maven/apache-maven-3.1.1
setar no PATH
export PATH=$M2_HOME/bin:$PATH
aumentar a memório
export MAVEN_OPTS=”-Xmx512m -XX:MaxPermSize=256m”

Para verificar se está instalado é só executar o comando:
mvn –version

Vai imprimir a versão do maven instalado.

3 comments so far, add yours

Trigger em MySQL com cursor

Segue um exemplo de trigger em mysql.

DELIMITER $$
create trigger trg_name after insert on t2 for each row
begin
DECLARE loop_completo INT DEFAULT FALSE;
DECLARE codigo INT;
DECLARE cur1 CURSOR FOR select t.column1 from t1 t;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET loop_completo = TRUE;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO codigo;
IF loop_completo THEN
LEAVE read_loop;
END IF;
insert into t3 (c1,c2,c3) values(column1,0,NEW.column1);
END LOOP;
CLOSE cur1;

end$$
DELIMITER ;

seja o primeiro a comentar

Habilitar auto login linux

Para habilitar o auto login no linux basta editar o seguinte arquivo:
/etc/init/tty1.conf

e adicionar a seguinte linha:

exec /bin/login -f nome_usuario < /dev/tty1 > /dev/tty1 2>&1

Pronto, já está logando automaticamente.

seja o primeiro a comentar

Capturar Erros ADF

Segue uma maneira de capturar os erros com ADF.

Crie uma classe:

package br.com.caiomoraes.exception;

import oracle.adf.view.rich.context.ExceptionHandler;
import javax.faces.application.FacesMessage;
import javax.faces.application.Severity;
import javax.faces.context.FacesContext;

public class MyCustonHandlerException extends ExceptionHandler {
	    public void handleException(FacesContext facesContext, Throwable throwable,
		                        PhaseId phaseId) throws Throwable {
		FacesMessage fm = new FacesMessage("ERRO PERSONALIZADO");
		Severity error =FacesMessage.SEVERITY_ERROR;
		fm.setSeverity(error);
		FacesContext.getCurrentInstance().addMessage(null, fm);
	}
}

Após crie esse arquivo:
.adf/META-INF/services/oracle.adf.view.rich.context.ExceptionHandler

dentro dele insere essa linha (pacote e nome da classe):
br.com.caiomoraes.exception.MyCustonHandlerException

Espero ter ajudado, agradecimento ao Luiz que ajudou diretamente nesse post.

seja o primeiro a comentar

Web Center – criar navigation personalizado

Para utilizar o menu do WebCenter, as vezes precisamos de criar um novo navigation.
Criar um novo navigation:
novo navigation
Detalhes do navigation:
Detalhes do navigation
Após criar para colocar na página deve-se listar dessa maneira:

#{navigationContext.navigationModel['navigation-admin'].listModel['startNode=/, includeStartNode=false']}

Onde o navigation-admin é o id do navigation, que você acabou de criar.
StartNode=/ ->iniciar a listagem no Root.
includeStartNode=false -> não mostrar o root.
Espero ter ajudado.

seja o primeiro a comentar

Jquery mask

Para colocar máscara personalizada em JQuery. No primeiro exemplo eu colocar o caracter ‘~’ como um curinga, sendo que ele vale um espaço ou um dígito.Nesse exemplo ele adiciona o número 9 quando o telefone é de São Paulo.
No segundo exemplo coloca a máscara de cnpj, onde não há necessidade de digitar todos os caracteres, o ponto de interrogação que faz esse efeito.

jQuery(function($){
$.mask.definitions['~']='[ 0-9]';
$("#telefone").mask("(99)~9999-9999");
});
jQuery(function($){
$("#cnpj").mask("?99.999.999/9999-99");
});

seja o primeiro a comentar

Formatar string

As vezes precisamos de formatar String como por exemplo colocar mascara no CNPJ.

 


String cnpj = "00000000000000";

cnpj.replaceAll("([0-9]{2})([0-9]{3})([0-9]{3})([0-9]{4})([0-9]{2})", "$1.$2.$3/$4-$5");

Ficará dessa maneira: 00.000.000/0000-00

Espero ter ajudado.

seja o primeiro a comentar

Internacionalizar Menu Web Center

Para internacionalizar o menu do web center deve-se alterar a página template gerada do Jdeveloper “pageTemplate_globe.jspx”.

Crie um arquivo .properties e set no jspx dessa maneira

<f:loadBundle basename="oracle.webcenter.portalframework.sitestructure.resource.PortalAppPageResource"
var="portalResource"/>

Altere essa linha:

<af:commandLink id="pt_cl1" text="#{node.title}"
inlineStyle="font-size:small;#{node.selected ? 'font-weight:bold;' : ''}"
action="pprnav"
disabled="#{not node.navigable}"
actionListener="#{navigationContext.processAction}"
clientComponent="#{node.attributes['Target'] == '_popup' ? true : false}">

Para:

<af:commandLink id="pt_cl1" text="#{not empty portalBundle[node.title] ? portalBundle[node.title] : node.title}"
inlineStyle="font-size:small;#{node.selected ? 'font-weight:bold;' : ''}"
action="pprnav"
disabled="#{not node.navigable}"
actionListener="#{navigationContext.processAction}"
clientComponent="#{node.attributes['Target'] == '_popup' ? true : false}">

Onde faz uma verificação para saber se não existir no arquivo properties ele exibe o valor informado no pages.xml.

 

seja o primeiro a comentar