Ola pessoal estou começando com Jboss seam e usei o generator do Seam para fazer uma aplicação crud. Bem simples são duas entidades, Noticias e Tipos de Noticias, onde uma noticia pode ser de varios tipos.
Só que agora eu estou tentando customiza-la e quando eu tento incluir um dado na base usando o EntityHome ele esta gerando a exceção: 14:08:58,713 WARN [lifecycle] #{noticiasHome.persist}: javax.persistence.TransactionRequiredException: no transaction is in progress
Já vi na web algumas soluções chamando o EntityManager mas queria o porque deste erro.
Agradeço desde já.
A minha NoticiaHome esta assim:
@Name(“noticiasHome”)
@Scope(ScopeType.CONVERSATION)
public class NoticiasHome extends EntityHome {
@In(create=true)
TiponoticiasHome tiponoticiasHome;
@DataModel
private List<Tiponoticias> tpNoticias;
public void setNoticiasId(Integer id){
setId(id);
}
public Integer getNoticiasId(){
return (Integer) getId();
}
@Override
protected Noticias createInstance(){
Noticias noticias = new Noticias();
return noticias;
}
public void wire(){
getInstance();
Tiponoticias tiponoticias = tiponoticiasHome.getDefinedInstance();
if (tiponoticias != null) {
getInstance().setTiponoticias(tiponoticias);
}
}
public boolean isWired() {
if (getInstance().getTiponoticias() == null) return false;
return true;
}
public Noticias getDefinedInstance(){
return isIdDefined() ? getInstance() : null;
}
@Factory(value="tpNoticias")
@SuppressWarnings("unchecked")
public void consultar(){
tpNoticias = getEntityManager().createQuery("select t from Tiponoticias t").getResultList();
}
Entidade Noticia:
@Entity
@Table(name=“noticias”, catalog=“clipping”)
public class Noticias implements java.io.Serializable {
/*
* Váriaveis
*/
private Integer id;
private String descricao;
private boolean ehDestaque;
private String linkArqPublic;
private String textoPublic;
private String titulo;
private Tiponoticias tiponoticias;
@Transient
private String destaque;
/*
* Construtores
*/
public Noticias() {
}
public Noticias(boolean ehDestaque, String textoPublic, String titulo) {
this.ehDestaque = ehDestaque;
this.textoPublic = textoPublic;
this.titulo = titulo;
}
public Noticias(String descricao, boolean ehDestaque, String linkArqPublic, String textoPublic, String titulo, Tiponoticias tiponoticias) {
this.descricao = descricao;
this.ehDestaque = ehDestaque;
this.linkArqPublic = linkArqPublic;
this.textoPublic = textoPublic;
this.titulo = titulo;
this.tiponoticias = tiponoticias;
}
/*
* Getters e setters
*/
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id", unique=true, nullable=false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@NotNull
@Length(max=50)
@Column(name="titulo", nullable=false, length=50)
public String getTitulo() {
return this.titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
@Column(name="descricao", length=250)
@Length(max=250)
public String getDescricao() {
return this.descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
@Column(name="ehDestaque", nullable=false)
@NotNull
public boolean isEhDestaque() {
return this.ehDestaque;
}
public void setEhDestaque(boolean ehDestaque) {
this.ehDestaque = ehDestaque;
}
@Transient
public String getDestaque() {
if(this.ehDestaque)
destaque = "Sim";
else
destaque = "Não";
return destaque;
}
@Length(max=80)
@Column(name="linkArqPublic", length=80)
public String getLinkArqPublic() {
return this.linkArqPublic;
}
public void setLinkArqPublic(String linkArqPublic) {
this.linkArqPublic = linkArqPublic;
}
@NotNull
@Length(max=500)
@Column(name="textoPublic", nullable=false, length=500)
public String getTextoPublic() {
return this.textoPublic;
}
public void setTextoPublic(String textoPublic) {
this.textoPublic = textoPublic;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="id", referencedColumnName="codigoTipo", insertable=false, updatable=false)
@NotNull
public Tiponoticias getTiponoticias() {
return this.tiponoticias;
}
public void setTiponoticias(Tiponoticias tiponoticias) {
this.tiponoticias = tiponoticias;
}
}
E o meu NoticiaEdit.xhtml
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
template=“layout/template.xhtml”>
<ui:define name=“body”>
<h:form id="noticias" styleClass="edit">
<rich:panel>
<f:facet name="header">#{noticiasHome.managed ? 'Atualizar' : 'Incluir'} Notícias</f:facet>
<s:decorate id="descricaoField" template="layout/edit.xhtml">
<ui:define name="label">Descrição</ui:define>
<h:inputTextarea id="descricao"
cols="80"
rows="3"
value="#{noticiasHome.instance.descricao}"/>
</s:decorate>
<s:decorate id="ehDestaqueField" template="layout/edit.xhtml">
<ui:define name="label">Será destaque</ui:define>
<h:selectBooleanCheckbox id="ehDestaque"
required="true"
value="#{noticiasHome.instance.ehDestaque}"/>
</s:decorate>
<s:decorate id="linkArqPublicField" template="layout/edit.xhtml">
<ui:define name="label">Link auxiliar</ui:define>
<h:inputText id="linkArqPublic"
size="80"
maxlength="80"
value="#{noticiasHome.instance.linkArqPublic}">
<a:support event="onblur" reRender="linkArqPublicField" bypassUpdates="true" ajaxSingle="true"/>
</h:inputText>
</s:decorate>
<s:decorate id="textoPublicField" template="layout/edit.xhtml">
<ui:define name="label">Texto public</ui:define>
<h:inputTextarea id="textoPublic"
cols="80"
rows="6"
required="true"
value="#{noticiasHome.instance.textoPublic}"/>
</s:decorate>
<s:decorate id="tituloField" template="layout/edit.xhtml">
<ui:define name="label">Titulo</ui:define>
<h:inputText id="titulo"
required="true"
size="50"
maxlength="50"
value="#{noticiasHome.instance.titulo}">
<a:support event="onblur" reRender="tituloField" bypassUpdates="true" ajaxSingle="true"/>
</h:inputText>
</s:decorate>
<s:decorate id="tipoDeNoticiaField" template="layout/edit.xhtml">
<ui:define name="label">Tipo de notícia</ui:define>
<h:selectOneMenu id="codigoTipo"
required="true"
value="#{noticiasHome.instance.tiponoticias}"
style="width:150px;"
requiredMessage="O tipo da noticia é obrigatorio">
<s:selectItems var="itemTipo"
value="#{tpNoticias}"
label="#{itemTipo.nomeDoTipo}"
noSelectionLabel="selecione..."
id="tiponoticias"/>
<s:convertEntity/>
</h:selectOneMenu>
</s:decorate>
<div style="clear:both">
<span class="required">*</span>
Campos obrigatórios
</div>
</rich:panel>
<div class="actionButtons">
<h:commandButton id="save"
value="Salvar"
action="#{noticiasHome.persist}"
/>
<h:commandButton id="update"
value="Atualizar"
action="#{noticiasHome.update}"
rendered="#{noticiasHome.managed}"/>
<h:commandButton id="delete"
value="Excluir"
action="#{noticiasHome.remove}"
immediate="true"
rendered="#{noticiasHome.managed}"/>
<s:button id="cancelEdit"
value="Cancelar edição"
propagation="end"
view="/Noticias.xhtml"
rendered="#{noticiasHome.managed}"/>
<s:button id="cancelAdd"
value="Cancelar inclusão"
propagation="end"
view="/#{empty noticiasFrom ? 'NoticiasList' : noticiasFrom}.xhtml"
rendered="#{!noticiasHome.managed}"/>
</div>
</h:form>
</ui:define>
</ui:composition>