Ireport com Field sendo um Objeto

Gelera estou trabalhando com o ireport + hibernnate, estou com um pequeno problema que tenho certeza que vcs iram tirar de letra.
Seguinte tenho várias classes mapeadas vou usar o exemplo da minha classe Estoque. Dentro dela tenho mapeado um relacionamento com a classe EstoqueFk e Produto, então para mim acessar um atributo da classe Produto tenho que fazer assim.: estoque.estoquefk.produto.nmProduto até aí blz.

estou mandando para o relatório uma lista da consulta de estoque, vou colocar o método para gerar o relatório.

	@Viewless   
	public void geraRelatorio() throws Exception{				
		
		/*
		 * Codigo para consultar a lista
		 */		
		
		PersistenciaDAO<Produto> persistenciaProduto = new PersistenciaDAO<Produto>();						
		List<Produto> list = persistenciaProduto.listarGenerico("SELECT e FROM Estoque e ");								  
		
		/*
		 * Final da consulta, retorna array para converter em pdf
		 */
		
		//Localiza o contexto da pasta onde esta localizado o .jasper
		String pathJasper = servletContext.getRealPath("/ireport/") + "/"; 
		
		//Faz o mapeamento do context para levar o .jasper a conversao em bytes
		Map parametros = new HashMap();
		parametros.put("ireport", pathJasper);
		parametros.put("estoque", list);
		
		try {
		//Recebe a lista do array populado	
		JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(list);
		//pega o ds + a conexao para ir ate o ireport para listar o array dentro do relatoriof
		JasperPrint impressao = JasperFillManager.fillReport(pathJasper + "/etiqueta.jasper",parametros, ds);
		
		//converte o relatorio em bytes gerando o pdf
		byte[] bytes = JasperExportManager.exportReportToPdf(impressao);
		byte[] arquivo = bytes;
		
		//Tratamento para exportacao do pdf para a url do browser e o tratamento de erros.
		String nomeDoArquivo = "etiqueta.pdf";
		response.setContentType("application/x-msdownload");
		response.setHeader("Content-Disposition", "attachment; filename=".concat(nomeDoArquivo));
		response.setContentLength(arquivo.length);
		ServletOutputStream sos = response.getOutputStream();
		sos.write(arquivo, 0, arquivo.length);
		sos.flush();
		sos.close();
		} catch (Exception e) {
		if(e.getClass().getSimpleName().equals("AbortException")){
		System.out.println("Documento cancelado");
		} else{
		System.out.println("Outros");
		}
		}
		}

Então tenho no map o diretório onde está mapeado meu .jasper e o resultado da consulta para enviar por parametro.

Lá no ireport está assim:

<?xml version="1.0" encoding="UTF-8"  ?>
<!-- Created with iReport - A designer for JasperReports -->
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport
		 name="etiqueta"
		 columnCount="1"
		 printOrder="Vertical"
		 orientation="Portrait"
		 pageWidth="595"
		 pageHeight="842"
		 columnWidth="535"
		 columnSpacing="0"
		 leftMargin="20"
		 rightMargin="20"
		 topMargin="20"
		 bottomMargin="20"
		 whenNoDataType="NoPages"
		 isTitleNewPage="false"
		 isSummaryNewPage="false">
	<property name="ireport.scriptlethandling" value="0" />
	<property name="ireport.encoding" value="UTF-8" />
	<import value="java.util.*" />
	<import value="net.sf.jasperreports.engine.*" />
	<import value="net.sf.jasperreports.engine.data.*" />

	<parameter name="estoque" isForPrompting="false" class="java.lang.Object"/>

	<field name="estoqueFk" class="com.estoque.bean.fk.EstoqueFk">
		<fieldDescription><![CDATA[estoqueFk]]></fieldDescription>
	</field>

	<variable name="estoque" class="com.estoque.bean.Estoque" resetType="Report" calculation="Nothing">
		<variableExpression><![CDATA[$P{estoque}]]></variableExpression>
	</variable>
		<background>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</background>
		<title>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</title>
		<pageHeader>
			<band height="1"  isSplitAllowed="true" >
			</band>
		</pageHeader>
		<columnHeader>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</columnHeader>
		<detail>
			<band height="126"  isSplitAllowed="true" >
				<rectangle>
					<reportElement
						x="4"
						y="2"
						width="368"
						height="120"
						key="rectangle-1"/>
					<graphicElement stretchType="NoStretch"/>
				</rectangle>
				<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
					<reportElement
						x="19"
						y="17"
						width="315"
						height="18"
						key="textField"/>
					<box></box>
					<textElement>
						<font/>
					</textElement>
				<textFieldExpression   class="java.lang.String"><![CDATA[$V{estoque}.getEstoqueFk().getProduto().getNmProduto()]]></textFieldExpression>
				</textField>
				<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
					<reportElement
						x="20"
						y="49"
						width="315"
						height="18"
						key="textField-1"/>
					<box></box>
					<textElement>
						<font/>
					</textElement>
				<textFieldExpression   class="java.lang.String"><![CDATA[$V{estoque}.getEstoqueFk().getProduto().getCdBarras()]]></textFieldExpression>
				</textField>
			</band>
		</detail>
		<columnFooter>
			<band height="1"  isSplitAllowed="true" >
			</band>
		</columnFooter>
		<pageFooter>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</pageFooter>
		<summary>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</summary>
</jasperReport>

Seguinte quando eu gero o pdf ele trás a quantidade de todos os produtos no estoque porém tudo null, tipo gera as páginas com os quadrados mais tudo null e não dá erro de compilação, o que pode ser???

Foi só retirar essa linha parametros.put("ireport", pathJasper); e montar o nome do parametro com o mesmo nome do map.