[RESOLVIDO]Struts 2 + JPA Dando erro na hora de inserir many to many

6 respostas
dcorteztec

Boa noite , bom é o seguinte tenho duas entidades curso e disciplina que estão relacionadas many to many até blz quando tento inserir esta dando esse erro, isso com a tabela disciplina já populada

No log do tom cat para aki na hora de inserir, quando vai inserir na tabela de relacionamento

já pesquisei bastante e não estou me dando bem se quiserem me ajudar ficarei muito feliz.

Hibernate: 
    insert 
    into
        Curso
        (descricao, duracao, nome) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        curso_disciplina
        (idCurso, idDisciplina) 
    values
        (?, ?)

GRAVE: Servlet.service() for servlet [default] in context with path [/curso] threw exception [javax.persistence.RollbackException: Error while committing the transaction] with root cause
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.curso.beans.Disciplina
	at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)
	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:456)
	at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:121)
	at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:815)
	at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1203)
	at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:188)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76)
	at br.com.curso.DAO.CursoImpl.adciona(CursoImpl.java:25)
	at br.com.curso.action.CursoAction.SaveCurso(CursoAction.java:41)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)
	at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
	at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:184)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:105)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:83)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:207)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:74)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:127)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:107)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:206)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:115)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:143)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:121)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:123)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
	at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
	at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
	at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
	at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:504)
	at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:422)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:237)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
CursoImpl e DisciplinaImpl
public void adciona(Disciplina disciplina) {
		EntityManager em = (EntityManager) JPAUtil.getInstance()
				.createEntityManager();
		if (em.getTransaction().isActive()) {
			
			em.persist(disciplina);
			em.flush();
			em.getTransaction().commit();
		} else {
			em.getTransaction().begin();
			
			em.persist(disciplina);
			em.flush();
			em.getTransaction().commit();
		}
	}
public void adciona(Curso curso) {
		EntityManager em = (EntityManager) JPAUtil.getInstance()
				.createEntityManager();
		if(em.getTransaction().isActive()) {
			
			em.persist(curso);
			em.flush();
			em.getTransaction().commit();
			}else {
			em.getTransaction().begin();
			
			em.persist(curso);
			em.flush();
			em.getTransaction().commit();
			}
	}
Action
public String SaveCurso(){
		CursoImpl cursoImpl = new CursoImpl();
		List<Disciplina> armazena = new ArrayList<Disciplina>();
		armazena.add(disciplina);
		curso.setDisciplinas(armazena);
		cursoImpl.adciona(curso);
		return "Save";
	}

6 Respostas

A

Por favor, poste o código de JPAUtil.

visola

Você não colocou o código das sua entidades. Mas estou supondo que elas estão com as anotações @Id e @GeneratedValue na propriedade que seria o id. É isso mesmo?
Senão, ignore meu comentário.

O método EntityManager.persist(…) só pode ser usado para salvar entidades novas (id null ou zero).
Acho que você tentou salvar uma entidade com ID mas está usando @GeneratedValue.
Se for gerar os IDs na mão, então não pode usar o GeneratedValue.
Senão, precisa usar o EntityManager.merge(…)

dcorteztec

Na pagina eu pego só o ID da disciplina e populo em outra tabela mapeada nas entidades

pagina JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Registration Page</title>
<s:head />
<style type="text/css">
@import url(css/style.css);
</style>
</head>
<body>

<s:form action="cadastraCurso">

<legend>Curso</legend>
<div>
<label><s:textfield name="curso.nome" label="nome"></s:textfield></label>
</div>
<div>
<label><s:textfield name="curso.descricao" label="Descrição"></s:textfield></label>
</div>
<div>
<label><s:textfield name="curso.duracao" label="Duração"></s:textfield></label>
</div>

<div>
<label><s:select label="Disciplina" name="disciplinas" list="disciplinas" listValue="nome" listKey="idDisciplina"/> </label>
</div>

<s:submit type="submit" id="submit-go">Cadastra</s:submit>
<s:actionmessage />

</s:form>
<s:if test="cursos.size() > 0">
<div class="content">
<table class="userTable" cellpadding="5px">
<tr class="even">
<th>Nome</th>
<th>Descrição</th>
<th>Duração</th>
<th>Edit</th>
<th>Delete</th>
</tr>
<s:iterator value="cursos" status="userStatus">
<tr class="<s:if test="#userStatus.odd == true ">odd</s:if> <s:else>even</s:else>">
<td><s:property value="nome" /></td>
<td><s:property value="descricao" /></td>
<td><s:property value="duracao" /></td>
<td>
<s:url id="editURL" action="prepara">
<s:param name="idCurso" value="%{idCurso}"></s:param>
</s:url>
<s:a href="%{editURL}"  theme="ajax" >Edit</s:a>
</td>
<td>
<s:url id="removeUrl" action="remove">
	<s:param name="idCurso" value="idCurso" />
	</s:url>
	<s:a href="%{removeUrl}" theme="ajax" targets="cursos">Remove</s:a>

</td>
</tr>
</s:iterator>
</table>
</div>
</s:if>
</body>
</html>

Entidades Curso

package br.com.curso.beans;

import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;

@NamedQueries({ 
	@NamedQuery(name = "getCurso.Discplina", query = "select c from Curso c inner join fetch c.disciplinas where c.nome like ?1"), 
	@NamedQuery(name="getCurso.Prepara",query="select c from Curso c inner join fetch c.disciplinas")

})

@Entity
public class Curso {

	@Id
	@GeneratedValue
	private Long idCurso;

	private String nome;

	private String descricao;

	private int duracao;

	@ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.REMOVE })
	@JoinTable(name = "curso_disciplina", joinColumns = { @JoinColumn(name = "idCurso") }, inverseJoinColumns = { @JoinColumn(name = "idDisciplina") })
	private List<Disciplina> disciplinas;

    

	public List<Disciplina> getDisciplinas() {
		return disciplinas;
	}

	public void setDisciplinas(List<Disciplina> disciplinas) {
		this.disciplinas = disciplinas;
	}

	public Long getIdCurso() {
		return idCurso;
	}

	public void setIdCurso(Long idCurso) {
		this.idCurso = idCurso;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public int getDuracao() {
		return duracao;
	}

	public void setDuracao(int duracao) {
		this.duracao = duracao;
	}

}

Disciplina

package br.com.curso.beans;

import java.util.List;


import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;

@NamedQueries({
		@NamedQuery(name = "getDisciplina", query = "select d from Disciplina d inner join fetch d.cursos as c where c.nome like ?1 "),
		@NamedQuery(name = "getDisciplina_Curso", query = "select d from Disciplina d inner join fetch d.cursos as c ") 
		
})
@Entity
public class Disciplina {

	@Id
	@GeneratedValue
	private Long idDisciplina;

	private String nome;

	@ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.MERGE,
			CascadeType.REMOVE })
	@JoinTable(name = "curso_disciplina", joinColumns = { @JoinColumn(name = "idDisciplina") }, inverseJoinColumns = { @JoinColumn(name = "idCurso") })
	private List<Curso> cursos;

	

	public List<Curso> getCursos() {
		return cursos;
	}

	public void setCursos(List<Curso> cursos) {
		this.cursos = cursos;
	}

	public Long getIdDisciplina() {
		return idDisciplina;
	}

	public void setIdDisciplina(Long idDisciplina) {
		this.idDisciplina = idDisciplina;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

}

JPAUTIL

package br.com.curso.util;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class JPAUtil {

	private static JPAUtil me;
	private EntityManagerFactory factory;

	private JPAUtil() {
		factory = Persistence.createEntityManagerFactory("curso");
	}

	public static JPAUtil getInstance() {
		if (me == null) {
			me = new JPAUtil();
		}
		return me;
	}

	public EntityManager createEntityManager() {
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		return em;
	}
}
visola

Então pode ser que você esteja salvando uma entidade nova no relacionamento.
Por exemplo, uma disciplina tem uma lista que contêm um curso que ainda não foi salvo.
O seu cascade está apenas para remover entidades. Persist não vai funcionar, não vai fazer cascade automático (não vai salvar as entidades do outro lado do relacionamento).
Tente colocar um tipo a mais de cascade, CascadeType.PERSIST, por exemplo, ou CascadeType.ALL.
Abraço.

dcorteztec

Eu acho que esta dando problema porq o valor do id da disciplina esta vindo nulo, eu listei pra ver e cadastrou, eu testei assim
Listando tudo da disciplina foi mais só q cadastrou repetidas vezes, se alguem tiver uma luz.

public String SaveCurso(){
		CursoImpl cursoImpl = new CursoImpl();
		DisciplinaImpl impl = new DisciplinaImpl();
		List armazena = impl.list();
		curso.setDisciplinas(armazena);
		
		cursoImpl.adciona(curso);
		return "Save";
	}
dcorteztec

Resolvi o problema estava na JSP

<div>  
<label><s:select label="Disciplina" name="disciplinas" list="disciplinas" listValue="nome" listKey="idDisciplina"/> </label>

faltou

<div>  
<label><s:select label="Disciplina" name="disciplina.idDisciplina" list="disciplinas" listValue="nome" listKey="idDisciplina"/> </label>
Criado 13 de janeiro de 2011
Ultima resposta 14 de jan. de 2011
Respostas 6
Participantes 3