Impedir que os itens sejam quebrados não tem como, né? A não ser que você mande no MAXIMO X itens para o relatório (referentes ao tamanho da página), acho que isso não seria muito interessante fazer! 
Outra idéia é enviar listas usando o DataSource JRBeanCollectionDataSource, cada objeto da lista seria um HashMap, no hashmap você poderia tratar o tamanho virtual que cabe em um relatório, fazendo com que no registro que exceda o tamanho da página, seja modificado o valor de alguma variavel auxiliar para “continua na proxima página”, por ex:
Lista de HashMap: (Vamos considerar que a página aceite no máximo 3 registros)
{{nome=“pedro”, msg=""}, {nome=“joao”, msg=""}, {nome=“josé”, msg=""}, {nome="",msg=“Continua na próxima página.”}, {nome=“paulo”, msg=""} }
Aí, lá no seu relatório, você define no detail uma expressão como:
(objeto field) code ? $F{nome} : $F{msg}[/code]
Faz uma classe que abstraia o relatório, e comece a passar coleções para ele ao invés de acesso direto ao banco, além de você poder tratar melhor seus dados, tem maior controle sobre o relatório…
qualquer dúvida posta aí!