[RESOLVIDO] selectManyCheckbox para cadastro de tabela com relacionamento N:N

Olá a todos!
Estou tentando fazer um cadastro com uma tabela que possui um relacionamento n:n

Para a tabela ‘guarnicao’ criei a seguinte classe:

@Entity
@Table(name = "guarnicao")
public class Guarnicao implements Serializable, Cloneable {

	private Integer codigo;
	private Date inicioTurno;
	private Date terminoTurno;
	private String atividade;
	private Viatura viatura;
	private List<Militar> militares = new ArrayList<Militar>();

//... getters and setters

	@ManyToMany
	@JoinTable(name = "guarnicao_militar", joinColumns = { @JoinColumn(name = "codigo_guarnicao", 
	unique = false, nullable = false, insertable = true) }, 
	inverseJoinColumns = { @JoinColumn(name = "codigo_militar", 
	unique = false, nullable = false, insertable = true) })
	public List<Militar> getMilitares() {
		return militares;
	}

	public void setMilitares(List<Militar> militares) {
		this.militares = militares;
	}
//...

para a tabela ‘militar’ criei a seguinte classe:

@Entity
@Table(name = "militar")
public class Militar implements Serializable, Cloneable {

	private Integer codigo;
	private String cargo;
	private String telefoneCelular;
	private String telefoneFixo;
	private String nomeCompleto;
	private String nomeGuerra;
	private String matricula;
	private Unidade unidade;

// ... getters and setters

Para selecionar os militares que serão incluídos na tabela relacional criei uma lista de checkbox:

<p:selectManyCheckbox
						value="#{cadastroGuarnicaoBean.guarnicao.militares}"
						layout="pageDirection" id="militares">
						<f:selectItems value="#{cadastroGuarnicaoBean.militares}"
							var="militar" itemLabel="#{militar.nomeGuerra}"
							itemValue="#{militar.codigo}" />
</p:selectManyCheckbox>

E no maneged bean:

@ManagedBean
public class CadastroGuarnicaoBean {

	private Repositorios repositorios = new Repositorios();
	private Guarnicao guarnicao = new Guarnicao();
	private List<Viatura> viaturas = new ArrayList<Viatura>();
	private List<Militar> militares = new ArrayList<Militar>();
	
	@PostConstruct
	public void init() {
		Viaturas viaturas = this.repositorios.getViaturas();
		this.viaturas = viaturas.todos();
		Militares militares = this.repositorios.getMilitares();
		this.militares = militares.todos();
	}

	public void salvar() {
		GestaoGuarnicoes gestaoGuarnicoes = new GestaoGuarnicoes(
				this.repositorios.getGuarnicoes());

		gestaoGuarnicoes.salvar(guarnicao);

		this.guarnicao = new Guarnicao();

		FacesUtil.adicionarMensagem(FacesMessage.SEVERITY_INFO,
				"Salvo com sucesso!");
	}

	public List<Viatura> getViaturas() {
		return viaturas;
	}

	public Guarnicao getGuarnicao() {
		return guarnicao;
	}

	public void setGuarnicao(Guarnicao guarnicao)
			throws CloneNotSupportedException {
		this.guarnicao = guarnicao;
		if (this.guarnicao == null) {
			this.guarnicao = new Guarnicao();
		} else {
			this.guarnicao = (Guarnicao) guarnicao.clone();
		}
	}

	public void setMilitares(List<Militar> militares) {
		this.militares = militares;
	}
	
	public List<Militar> getMilitares() {
		return militares;
	}
	
}

Está carregando todos os militares nos checkboxs, mas quando seleciono os checkboxs e clico em salvar aparece o seguinte erro na console:

23/09/2012 15:29:29 org.hibernate.property.BasicPropertyAccessor$BasicGetter get
ERROR: HHH000122: IllegalArgumentException in class: br.org.siscoweb.model.Militar, getter method of property: codigo
23/09/2012 15:29:29 javax.faces.event.MethodExpressionActionListener processAction
SEVERE: 'org.hibernate.PropertyAccessException' recebido ao invocar escuta de ação '#{cadastroGuarnicaoBean.salvar}' para o componente 'j_idt47'
23/09/2012 15:29:29 javax.faces.event.MethodExpressionActionListener processAction
SEVERE: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of br.org.siscoweb.model.Militar.codigo
	at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:187)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:341)
	at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4425)
	at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4147)
	at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:209)
	at org.hibernate.type.EntityType.replace(EntityType.java:283)
	at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:496)
	at org.hibernate.type.CollectionType.replace(CollectionType.java:563)
	at org.hibernate.type.AbstractType.replace(AbstractType.java:178)
	at org.hibernate.type.TypeHelper.replaceAssociations(TypeHelper.java:261)
	at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:398)
	at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:221)
	at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:154)
	at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76)
	at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:900)
	at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:884)
	at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:888)
	at br.org.siscoweb.repository.infra.GuarnicoesHibernate.guardar(GuarnicoesHibernate.java:20)
	at br.org.siscoweb.service.GestaoGuarnicoes.salvar(GestaoGuarnicoes.java:15)
	at br.org.siscoweb.view.CadastroGuarnicaoBean.salvar(CadastroGuarnicaoBean.java:39)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:264)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at br.org.siscoweb.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:29)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:679)
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:164)
	... 57 more

23/09/2012 15:29:29 com.sun.faces.context.AjaxExceptionHandlerImpl log
SEVERE: JSF1073: javax.faces.event.AbortProcessingException obtido durante o processamento de INVOKE_APPLICATION 5: UIComponent-ClientId=j_idt30:j_idt47, Message=org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of br.org.siscoweb.model.Militar.codigo
23/09/2012 15:29:30 com.sun.faces.context.AjaxExceptionHandlerImpl log
SEVERE: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of br.org.siscoweb.model.Militar.codigo
javax.faces.event.AbortProcessingException: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of br.org.siscoweb.model.Militar.codigo
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:182)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at br.org.siscoweb.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:29)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:679)
Caused by: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of br.org.siscoweb.model.Militar.codigo
	at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:187)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:341)
	at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4425)
	at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4147)
	at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:209)
	at org.hibernate.type.EntityType.replace(EntityType.java:283)
	at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:496)
	at org.hibernate.type.CollectionType.replace(CollectionType.java:563)
	at org.hibernate.type.AbstractType.replace(AbstractType.java:178)
	at org.hibernate.type.TypeHelper.replaceAssociations(TypeHelper.java:261)
	at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:398)
	at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:221)
	at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:154)
	at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76)
	at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:900)
	at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:884)
	at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:888)
	at br.org.siscoweb.repository.infra.GuarnicoesHibernate.guardar(GuarnicoesHibernate.java:20)
	at br.org.siscoweb.service.GestaoGuarnicoes.salvar(GestaoGuarnicoes.java:15)
	at br.org.siscoweb.view.CadastroGuarnicaoBean.salvar(CadastroGuarnicaoBean.java:39)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:264)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153)
	... 31 more
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:164)
	... 57 more

Alguém tem uma idéia de onde pode estar o erro?

Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class 

org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of br.org.siscoweb.model.Militar.codigo 

Creio que você esteja acessando algo que não foi instanciado, como exibe a mensagem.

tenta alterar seu metodo salvar:

[code]public void salvar() {
GestaoGuarnicoes gestaoGuarnicoes = new GestaoGuarnicoes(
this.repositorios.getGuarnicoes());

    gestaoGuarnicoes.salvar(guarnicao);  

    this.guarnicao = new Guarnicao();  //retire esta instância e execute novamente, considero desnescessária.

    FacesUtil.adicionarMensagem(FacesMessage.SEVERITY_INFO,  
            "Salvo com sucesso!");  
}  

[/code]

[quote=aprendizweb]tenta alterar seu metodo salvar:

[code]public void salvar() {
GestaoGuarnicoes gestaoGuarnicoes = new GestaoGuarnicoes(
this.repositorios.getGuarnicoes());

    gestaoGuarnicoes.salvar(guarnicao);  

    this.guarnicao = new Guarnicao();  //retire esta instância e execute novamente, considero desnescessária.

    FacesUtil.adicionarMensagem(FacesMessage.SEVERITY_INFO,  
            "Salvo com sucesso!");  
}  

[/code][/quote]

Esta linha do código serve apenas para limpar os campos após salvar o registro.

[quote=aprendizweb]tenta alterar seu metodo salvar:

[code]public void salvar() {
GestaoGuarnicoes gestaoGuarnicoes = new GestaoGuarnicoes(
this.repositorios.getGuarnicoes());

    gestaoGuarnicoes.salvar(guarnicao);  

    this.guarnicao = new Guarnicao();  //retire esta instância e execute novamente, considero desnescessária.

    FacesUtil.adicionarMensagem(FacesMessage.SEVERITY_INFO,  
            "Salvo com sucesso!");  
}  

[/code][/quote]

Esta linha do código serve apenas para limpar os campos após salvar o registro.

Bem galera,

cheguei a seguinte ponto neste código:

Adicionei no managed bean:

	private Militar[] militaresSelecionados;
  // getters and setters

Mudei do primefaces para o componente padrão do jsf pois o primeiro não estava setando o ‘militaresSelecionados’, estava aparecendo um erro de conversão.

<h:selectManyCheckbox label="Militar" value="#{cadastroGuarnicaoBean.militaresSelecionados}"
						layout="pageDirection" id="militares">
						<f:selectItems value="#{cadastroGuarnicaoBean.militares}"
							var="militar" itemLabel="#{militar.nomeGuerra}"
							itemValue="#{militar}" />
					</h:selectManyCheckbox>

No método para salvar:

public void salvar() {
		GestaoGuarnicoes gestaoGuarnicoes = new GestaoGuarnicoes(
				this.repositorios.getGuarnicoes());

		guarnicao.setMilitares(getMilitares()); // coloquei isto para forçar que seja salvo na tabela 'guarnicao_militar' o relacionamento entre a guarnição que estou salvando e todos os militares existentes, só para fazer o teste mesmo
		gestaoGuarnicoes.salvar(guarnicao);

		this.guarnicao = new Guarnicao();

		FacesUtil.adicionarMensagem(FacesMessage.SEVERITY_INFO,
				"Salvo com sucesso!");
	}

com estas alterações estou conseguindo pegar no ‘militaresSelecionados’ um vetor com os militares que selecionei, porém agora preciso que apenas estes registros que selecionei no vetor sejam salvos na tabela relacional.

Alguém tem ideia de como faço isso?

[quote=Wendell Albino]Bem galera,

cheguei a seguinte ponto neste código:

Adicionei no managed bean:

	private Militar[] militaresSelecionados;
  // getters and setters

Mudei do primefaces para o componente padrão do jsf pois o primeiro não estava setando o ‘militaresSelecionados’, estava aparecendo um erro de conversão.

<h:selectManyCheckbox label="Militar" value="#{cadastroGuarnicaoBean.militaresSelecionados}"
						layout="pageDirection" id="militares">
						<f:selectItems value="#{cadastroGuarnicaoBean.militares}"
							var="militar" itemLabel="#{militar.nomeGuerra}"
							itemValue="#{militar}" />
					</h:selectManyCheckbox>

No método para salvar:

public void salvar() {
		GestaoGuarnicoes gestaoGuarnicoes = new GestaoGuarnicoes(
				this.repositorios.getGuarnicoes());

		guarnicao.setMilitares(getMilitares()); // coloquei isto para forçar que seja salvo na tabela 'guarnicao_militar' o relacionamento entre a guarnição que estou salvando e todos os militares existentes, só para fazer o teste mesmo
		gestaoGuarnicoes.salvar(guarnicao);

		this.guarnicao = new Guarnicao();

		FacesUtil.adicionarMensagem(FacesMessage.SEVERITY_INFO,
				"Salvo com sucesso!");
	}

com estas alterações estou conseguindo pegar no ‘militaresSelecionados’ um vetor com os militares que selecionei, porém agora preciso que apenas estes registros que selecionei no vetor sejam salvos na tabela relacional.

Alguém tem ideia de como faço isso?
[/quote]

Pq ao invéz disso:

	private Militar[] militaresSelecionados;
	// getters and setters

Vc ñ faz isso?

	private List<Militar> militaresSelecionados;
	// getters and setters

como você mapiou como List na sua entidade é só da um set…
você ja tentou isso??

[quote=mihawk~]
Pq ao invéz disso:

	private Militar[] militaresSelecionados;
	// getters and setters

Vc ñ faz isso?

	private List<Militar> militaresSelecionados;
	// getters and setters

como você mapiou como List na sua entidade é só da um set…
você ja tentou isso??[/quote]

Eu tentei desta forma sim, porém não funciona.

Consegui resolver assim utilizando o componente padrão do JSF <h:selectManyCheckbox:

public void salvar() {
		GestaoGuarnicoes gestaoGuarnicoes = new GestaoGuarnicoes(
				this.repositorios.getGuarnicoes());

		List<Militar> listaSelecionados = Arrays.asList(militaresSelecionados); // usei esta linha para converter o array em List
		guarnicao.setMilitares(listaSelecionados); // seta a list apenas com o militares selecionados 
		gestaoGuarnicoes.salvar(guarnicao);

		this.guarnicao = new Guarnicao();
		Arrays.fill(this.militaresSelecionados, null); // limpa os checkboxs

		FacesUtil.adicionarMensagem(FacesMessage.SEVERITY_INFO,
				"Salvo com sucesso!");
	}

Porém com o primefaces <p:selectManyCheckbox aparece o erro:

25/09/2012 12:54:55 com.sun.faces.lifecycle.ProcessValidationsPhase execute
WARNING: For input string: "br.org.siscoweb.model.Militar@5b"
java.lang.NumberFormatException: For input string: "br.org.siscoweb.model.Militar@5b"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:481)
	at java.lang.Integer.<init>(Integer.java:636)
	at br.org.siscoweb.converter.MilitarConverter.getAsObject(MilitarConverter.java:24)
	at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValues(MenuRenderer.java:514)
	at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValuesForModel(MenuRenderer.java:338)
	at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValue(MenuRenderer.java:129)
	at com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:315)
	at org.primefaces.component.selectmanycheckbox.SelectManyCheckboxRenderer.getConvertedValue(SelectManyCheckboxRenderer.java:36)
	at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030)
	at javax.faces.component.UIInput.validate(UIInput.java:960)
	at javax.faces.component.UIInput.executeValidate(UIInput.java:1233)
	at javax.faces.component.UIInput.processValidators(UIInput.java:698)
	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
	at org.primefaces.component.panel.Panel.processValidators(Panel.java:293)
	at javax.faces.component.UIForm.processValidators(UIForm.java:253)
	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
	at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1172)
	at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at br.org.siscoweb.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:29)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:679)

Creio que tenho que criar um conversor para o <p:selectManyCheckbox

Solução:

<p:selectManyCheckbox
						value="#{cadastroGuarnicaoBean.militaresSelecionados}""
						layout="pageDirection" id="militares">
						<f:selectItems value="#{cadastroGuarnicaoBean.militares}"
							var="militar" itemLabel="#{militar.nomeGuerra}"
							itemValue="#{militar}" />
</p:selectManyCheckbox>
private Militar[] militaresSelecionados;

//
public void salvar() {
		GestaoGuarnicoes gestaoGuarnicoes = new GestaoGuarnicoes(
				this.repositorios.getGuarnicoes());

		List<Militar> listaSelecionados = Arrays.asList(militaresSelecionados); // usei esta linha para converter o array em List
		guarnicao.setMilitares(listaSelecionados); // seta a list apenas com o militares selecionados 
		gestaoGuarnicoes.salvar(guarnicao);

		this.guarnicao = new Guarnicao();
		Arrays.fill(this.militaresSelecionados, null); // limpa os checkboxs

		FacesUtil.adicionarMensagem(FacesMessage.SEVERITY_INFO,
				"Salvo com sucesso!");
	}