Estou persistindo meu Objeto normal, mais não salva meus atributos no banco

14 respostas
jsfprimefaceshibernatejava
D

estou salvando meu objeto, mais só salva o codigo.

OBS: como estou no começo do projeto, só fiz a parte de persistir, e no banco eu verifico. acho que não está faltando nada.

@Entity
public class Fabricante {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer codigo;
private String descricao;

public Integer getCodigo() {
	return codigo;
}
public void setCodigo(Integer codigo) {
	this.codigo = codigo;
}
public String getDescricao() {
	return descricao;
}
public void setDescricao(String descricao) {
	this.descricao = descricao;
}

public class FabricanteDAO implements Serializable{

private static final long serialVersionUID = 1L;

@Inject
EntityManager manager;

@Transactional
public void salvar(Fabricante fabricante) {
	manager.merge(fabricante);
}

public class FabricanteService implements Serializable{

private static final long serialVersionUID = 1L;


@Inject
private FabricanteDAO dao;


public void salvar(Fabricante fabricante) throws NegocioException{
	try{
		dao.salvar(fabricante);
		Messages.addGlobalInfo("Fabricante salvo com sucesso!");
	}
	catch (Exception e) {
		throw new NegocioException("Não foi possível salvar o Fabricante");
	}
}

@Named
@ViewScoped
public class FabricanteBean implements Serializable {

private static final long serialVersionUID = 1L;

@Inject
private FabricanteService service;

private Fabricante fabricante;

@PostConstruct
public void inicializar() {
	this.fabricante = new Fabricante();
}


public void salvar() throws NegocioException {
	service.salvar(fabricante);
	this.fabricante = new Fabricante();
}

public Fabricante getFabricante() {
	return fabricante;
}

public void setFabricante(Fabricante fabricante) {
	this.fabricante = fabricante;
}

}

<ui:composition template="/WEB-INF/template/layoutPadrao.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p=“http://primefaces.org/ui”>

<ui:define name="titulo">Cadastro de Fabricante</ui:define>

<ui:define name="corpo">
	<!-- <f:metadata>
		<o:viewParam name="fabricante" value="#{cadastroFabricanteBean.fabricante}" />
		<f:viewAction action="#{cadastroFabricanteBean.inicializar}"/>
	</f:metadata> -->

	<h1>Cadastro de Fabricante</h1>
	
	<h:form id="frmCadastro">
		<p:messages id="messages" autoUpdate="true" closable="true" />

    	<p:toolbar style="margin-top: 20px">
    		<p:toolbarGroup>
    			<p:commandButton value="Salvar" action="#{fabricanteBean.salvar}" id="botaoSalvar"  update="frmCadastro"/>
    		</p:toolbarGroup>
    		<p:toolbarGroup align="right">
				<p:button value="Pesquisa" outcome="pesquisaFabricante"/>
			</p:toolbarGroup>
    	</p:toolbar>
    	
    	<p:panelGrid columns="2" id="painel" style="width: 100%; margin-top: 20px" columnClasses="rotulo, campo">
    		<p:outputLabel value="Código" for="codigo" />
    		<p:inputText id="codigo" size="10" value="#{fabricanteBean.fabricante.codigo}"  maxlength="20" readonly="true" />
    		
    		<p:outputLabel value="Nome" for="nome"/>
    		<p:inputText id="nome" size="60" value="#{fabricanteBean.fabricante.descricao}" maxlength="80" />
    		
    	</p:panelGrid>
	</h:form>
</ui:define>

</ui:composition>

14 Respostas

L

Você colocou no persistence.xml que tua Persistence Unit utiliza JTA?

D

Olá, estou fazer da forma tradicional mesmo, sem usar o JTA porque não quero pular a etapa “braçal” porque estou aprendendo…

persistence.xml

<persistence-unit name="controleServico">

	<provider>org.hibernate.ejb.HibernatePersistence</provider>
	
	<class>model.Fabricante</class>
		
	<properties>
		<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
		<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/oficina" />
		<property name="javax.persistence.jdbc.user" value="root" />
		<property name="javax.persistence.jdbc.password" value="root" />

		<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
		<property name="hibernate.hbm2ddl.auto" value="update" />
		<property name="hibernate.show_sql" value="true" />
		<property name="hibernate.format_sql" value="true" />
	</properties>
</persistence-unit>
L

Então, por isso não está funcionando. Você está pedindo para o container gerenciar tua transação (@Transactional), mas tua persistence unit não utiliza JTA. Tenta colocar isso aqui:

manager.getTransaction().begin();
manager.merge(fabricante);
manager.getTransaction().commit();

A propósito, por padrão, todos os ejb são transactional, com o atributo de transação REQUIRED, portanto não precisa colocar @Transactional nos métodos.

D

Tinha esquecido de colocar isso

@ApplicationScoped
public class EntityManagerProducer {

private EntityManagerFactory factory;

public EntityManagerProducer() {
	this.factory = Persistence.createEntityManagerFactory("controleServico");
}

@Produces  
@javax.enterprise.context.RequestScoped 
public EntityManager create() {
	return factory.createEntityManager();
}

//@Dispose ele fecha
public void close(@Disposes EntityManager manager) {
	manager.close();
}

}

@InterceptorBinding
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Transactional {

}
@Priority(Interceptor.Priority.LIBRARY_BEFORE)

@Interceptor

@Transactional

public class TransactionInterceptor implements Serializable {
private static final long serialVersionUID = 1L;

@Inject
private EntityManager manager;

@AroundInvoke
public Object invoke(InvocationContext context) throws Exception {
	EntityTransaction transaction = manager.getTransaction();
	boolean owner = false;

	try {
		if (!transaction.isActive()) { //Se a transação £o estiver ativa.
			// truque para fazer rollback no que ¡ passou
			// (senão, um futuro commit, confirmaria até mesmo operações sem transação)
			transaction.begin(); //inicia a transação
			transaction.rollback(); //caso tenho algum erro,faz um rollback
			
			// agora sim inicia a transação
			transaction.begin();
			
			owner = true;
		}

		return context.proceed(); //continua o ©todo que está com anotação @Transacional ex: salvar.
	} catch (Exception e) {
		if (transaction != null && owner) {
			transaction.rollback();
		}

		throw e;
	} finally {
		if (transaction != null && transaction.isActive() && owner) {
			transaction.commit();
		}
	}
}

}

P

De alguma forma, coloque um ponto de interrupção ou imprima os atributos do seu objeto exatamente antes de salvar no banco (no DAO).

O que aparece?

D

Opa! acho que descobri, conforme um exemplo que poderia fazer, como esotu usando CDI, quando anotei @Named e na minha view ele não está aparecendo meus atributos do bean, vi lendo algumas coisas e vi o CDI não tem view Scoped. isso procede?

P

Existe @ViewScoped sim. Só importar ( javax.faces.view.ViewScoped ).

Se você colocou apenas @Named e nenhuma outra anotação, parece estar pegando @RequestScoped por padrão e por isso, os objetos não estão sendo populados.

D

Ao tentar rodar, estou com esse Erro. creio que é alguma coisa envolvendo o weld, se eu usar o @ManagedBean e colocar para imiprimir no console alguma coisa atráves da action da certo.

GRAVE: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/irmao_Suspension]]
	at java.util.concurrent.FutureTask.report(FutureTask.java:122)
	at java.util.concurrent.FutureTask.get(FutureTask.java:192)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:939)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:872)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/irmao_Suspension]]
	at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
	... 6 more
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-000072: Bean declaring a passivating scope must be passivation capable.  Bean:  Managed Bean [class irmaoSuspension.bean.FabricanteBean] with qualifiers [@Default @Any @Named]
	at org.jboss.weld.bean.ManagedBean.checkType(ManagedBean.java:213)
	at org.jboss.weld.bean.AbstractBean.initializeAfterBeanDiscovery(AbstractBean.java:107)
	at org.jboss.weld.bean.ManagedBean.initializeAfterBeanDiscovery(ManagedBean.java:122)
	at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$AfterBeanDiscoveryInitializerFactory.doWork(ConcurrentBeanDeployer.java:136)
	at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$AfterBeanDiscoveryInitializerFactory.doWork(ConcurrentBeanDeployer.java:127)
	at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:63)
	at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:56)
	... 4 more

fev 24, 2017 8:53:21 AM org.apache.catalina.core.ContainerBase startInternal
GRAVE: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: A child container failed during start
	at java.util.concurrent.FutureTask.report(FutureTask.java:122)
	at java.util.concurrent.FutureTask.get(FutureTask.java:192)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:939)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:793)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:655)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:355)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495)
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:948)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:872)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

fev 24, 2017 8:53:21 AM org.apache.catalina.startup.Catalina start
GRAVE: The required Server component failed to start so Tomcat is unable to start.
org.apache.catalina.LifecycleException: A child container failed during start
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:948)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:793)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:655)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:355)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495)

fev 24, 2017 8:53:21 AM org.apache.coyote.AbstractProtocol pause
INFORMAÇÕES: Pausing ProtocolHandler ["http-nio-8080"]
fev 24, 2017 8:53:21 AM org.apache.coyote.AbstractProtocol pause
INFORMAÇÕES: Pausing ProtocolHandler ["ajp-nio-8009"]
fev 24, 2017 8:53:21 AM org.apache.catalina.core.StandardService stopInternal
INFORMAÇÕES: Stopping service Catalina
fev 24, 2017 8:53:21 AM org.apache.coyote.AbstractProtocol destroy
INFORMAÇÕES: Destroying ProtocolHandler ["http-nio-8080"]
fev 24, 2017 8:53:21 AM org.apache.coyote.AbstractProtocol destroy
INFORMAÇÕES: Destroying ProtocolHandler ["ajp-nio-8009"]
fev 24, 2017 8:53:21 AM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
ADVERTÊNCIA: The web application [irmao_Suspension] appears to have started a thread named [weld-worker-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
 java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 java.lang.Thread.run(Thread.java:745)
fev 24, 2017 8:53:21 AM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
ADVERTÊNCIA: The web application [irmao_Suspension] appears to have started a thread named [weld-worker-2] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
 java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 java.lang.Thread.run(Thread.java:745)
fev 24, 2017 8:53:21 AM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
ADVERTÊNCIA: The web application [irmao_Suspension] appears to have started a thread named [weld-worker-3] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
 java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 java.lang.Thread.run(Thread.java:745)
fev 24, 2017 8:53:21 AM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
ADVERTÊNCIA: The web application [irmao_Suspension] appears to have started a thread named [weld-worker-4] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
 java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 java.lang.Thread.run(Thread.java:745)
fev 24, 2017 8:53:21 AM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
ADVERTÊNCIA: The web application [irmao_Suspension] appears to have started a thread named [weld-preloader-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
 java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 java.lang.Thread.run(Thread.java:745)
fev 24, 2017 8:53:21 AM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
ADVERTÊNCIA: The web application [irmao_Suspension] appears to have started a thread named [weld-preloader-3] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
 java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 java.lang.Thread.run(Thread.java:745)
fev 24, 2017 8:53:21 AM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
ADVERTÊNCIA: The web application [irmao_Suspension] appears to have started a thread named [weld-preloader-2] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
 java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 java.lang.Thread.run(Thread.java:745)
P

Isso aconteceu após vc colocar @ViewScoped?

D

sim olha como está meu projeto, acho que está normal

P

Cole aqui o seu código do Managed Bean.

D
import javax.annotation.PostConstruct;

import javax.faces.view.ViewScoped;

import javax.inject.Inject;

import javax.inject.Named;
import irmaoSuspension.jsf.NegocioException;

import irmaoSuspension.model.Fabricante;

import irmaoSuspension.service.FabricanteService;

@Named
@ViewScoped
public class FabricanteBean {

@Inject
private FabricanteService service;

private Fabricante fabricante;

@PostConstruct
void iniciar() {
	this.fabricante = new Fabricante();
	System.out.println("Fabricante Construido.");
}

public void salvar() throws NegocioException {
	service.salvar(fabricante);
	
}

public Fabricante getFabricante() {
	return fabricante;
}

public void setFabricante(Fabricante fabricante) {
	this.fabricante = fabricante;
}}
D

eu não sei mais como resolver.

D

Estou testando direto no meu Dao e estou tendo esse Erro:

Na resposta acima, eu criei uma classe para Transação, criei uma anotation Transacional, e uma classe para Criação do EntityManager

Exception in thread "main" java.lang.NullPointerException
	at dao.FabricanteDAO.salvar(FabricanteDAO.java:18)
	at dao.FabricanteDAO.main(FabricanteDAO.java:43)


@Inject
EntityManager em;

@Transactional
public void salvar(Fabricante fabricante) {
	em.persist(fabricante);
}

public static void main(String[] args) {
		Fabricante fabricante = new Fabricante();
		fabricante.setCodigo(2);
		fabricante.setDescricao("Toyota");
		
		FabricanteDAO fabricanteDAO = new FabricanteDAO();
		
		fabricanteDAO.salvar(fabricante);
		
	}
Criado 22 de fevereiro de 2017
Ultima resposta 24 de fev. de 2017
Respostas 14
Participantes 3