2013-04-22 99 views
0

我有使用EntityManager persist()方法的问题。 我使用JSF2.0,glassfish 3,JPA和hibernate,我不使用spring。EntityManager persist()方法不插入记录到数据库=> SEVERE:javax.persistence.TransactionRequiredException

我尝试添加事件与方法的事件表坚持下去,但EntityManager的persist()方法不插入记录到数据库中,我有此错误信息=>

重度:javax.persistence.TransactionRequiredException 在com.sun.enterprise.container.common.impl.EntityManagerWrapper.doTxRequiredCheck(EntityManagerWrapper.java:163) 在com.sun.enterprise.container.common.impl.EntityManagerWrapper.flush(EntityManagerWrapper.java:411) 在DAO .EvenementDao.addEvenement(EvenementDao.java:128)。

@ManagedBean 
@Stateless 
public class EvenementDao implements Serializable{ 

/** 
* 
*/ 
private static final long serialVersionUID = -3343483942392617877L; 
/** 
* 
*/ 


private List<TEvenement> listeEvenement; 
private List<SelectItem> listeSelectItemEvnt; 
private TEvenement tevenement ; 




public EvenementDao() { 

} 


@PersistenceUnit(unitName="GA2010-ejbPU-dev") 
private EntityManagerFactory emf; 



@PostConstruct 
private void init() { 

    tevenement = new TEvenement(); 

} 



public List<TEvenement> getListeEvenement() { 
EntityManager em = emf.createEntityManager(); 
    TypedQuery<TEvenement> requete = m.createNamedQuery("TEvenement.findPrivateOther", 
    TEvenement.class); 
    listeEvenement = requete.getResultList(); 

    return listeEvenement; 
} 

public TEvenement getEvenement() { 
    return tevenement; 
} 



public void setEvenement(TEvenement evenement) { 
    this.tevenement = evenement; 
} 



public void addEvenement(){ 
    EntityManager em = emf.createEntityManager(); 
HttpSession session = (HttpSession) FacesContext.getCurrentInstance(). 
          getExternalContext().getSession(false); 
    Integer codeUser = (Integer) session.getAttribute("codeUser"); 
    tevenement.setUtilCreation(codeUser); 

    System.out.println("je rentre dans addevenemnt"); 
    try{ 




     System.out.println("i persist "+ em); 

      em.persist(tevenement); 
      em.flush(); 
     System.out.println(tevenement.getDetailsEvenement()); 

     FacesMessage message = new FacesMessage("Evenement ajouté avec succès."); 
     FacesContext.getCurrentInstance().addMessage(null, message); 


    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

} 

}

所以,这是行不通的,但编程'的fonction addEvenement,FacesMessage就会消息=新的FacesMessage输入( “EvenementajoutéAVEC更迭。”);将消息返回给我,好像它在工作。 我这是因为我的entityMAnager,但实际上ohter函数适用于同一个实体管理器,所以我不明白。

**public List<TEvenement> getListeEvenement()** { 
    EntityManager em = emf.createEntityManager(); 
    TypedQuery<TEvenement> requete =  em.createNamedQuery("TEvenement.findPrivateOther", TEvenement.class); 
    listeEvenement = requete.getResultList(); 

    return listeEvenement; 
} 

这个工作得很好,唯一的区别是,在这种情况下,查询是一个选择,并在其他情况下,它是一个持续存在,因此一个查询影响数据库。

实体的代码:

@Entity @Table(名称= “t_evenements”) @NamedQueries({@ NamedQuery(名称= “TEvenement.findAll”,查询=“SELECT EVNT FROM TEvenement EVNT “), @NamedQuery(名称=” TEvenement.findPrivateOther”,查询= “SELECT EVNT FROM TEvenement EVNT WHERE evnt.typeEvenement = 6 OR evnt.typeEvenement = 7”)}) 公共类TEvenement实现Serializable {

private static final long serialVersionUID = -1908959833491896991L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name="REF_EVENEMENT", unique=true, nullable=false) 
private Integer refEvenement; 

@Temporal(TemporalType.DATE) 
@Column(name="DATE_DEBUT_EVENEMENT") 
private Date dateDebutEvenement; 

@Temporal(TemporalType.DATE) 
@Column(name="DATE_FIN_EVENEMENT") 
private Date dateFinEvenement; 

@Column(name="DETAILS_EVENEMENT") 
private String detailsEvenement; 

@Column(name="IS_EVERYDAY") 
private byte isEveryday; 

@Column(name="RAPPEL_EVENEMENT") 
private int rappelEvenement; 

public Integer getUtilEvenement() { 
    return utilEvenement; 
} 

public void setUtilEvenement(Integer utilEvenement) { 
    this.utilEvenement = utilEvenement; 
} 

@Column(name="TITRE_EVENEMENT") 
private String titreEvenement; 

@Column(name="TYPE_EVENEMENT") 
private String typeEvenement; 

@Column(name="UTIL_COPIE_EVENEMENT") 
private Integer utilCopieEvenement; 

@Column(name="UTIL_EVENEMENT") 
private Integer utilEvenement; 

@Column(name="HEURE_EVENEMENT") 
private String heureEvenement; 

@Column(name="UTIL_CREATION") 
private Integer utilCreation; 


public String getHeureEvenement() { 
    return heureEvenement; 
} 

public void setHeureEvenement(String heureEvenement) { 
    this.heureEvenement = heureEvenement; 
} 

public TEvenement() { 
} 

public Integer getRefEvenement() { 
    return this.refEvenement; 
} 

public void setRefEvenement(int refEvenement) { 
    this.refEvenement = refEvenement; 
} 

public Date getDateDebutEvenement() { 
    return this.dateDebutEvenement; 
} 

public Integer getUtilCreation() { 
    return utilCreation; 
} 

public void setUtilCreation(Integer utilCreation) { 
    this.utilCreation = utilCreation; 
} 

public void setUtilCopieEvenement(Integer utilCopieEvenement) { 
    this.utilCopieEvenement = utilCopieEvenement; 
} 

public void setDateDebutEvenement(Date dateDebutEvenement) { 
    this.dateDebutEvenement = dateDebutEvenement; 
} 

public Date getDateFinEvenement() { 
    return this.dateFinEvenement; 
} 

public void setDateFinEvenement(Date dateFinEvenement) { 
    this.dateFinEvenement = dateFinEvenement; 
} 

public String getDetailsEvenement() { 
    return this.detailsEvenement; 
} 

public void setDetailsEvenement(String detailsEvenement) { 
    this.detailsEvenement = detailsEvenement; 
} 

public byte getIsEveryday() { 
    return this.isEveryday; 
} 

public void setIsEveryday(byte isEveryday) { 
    this.isEveryday = isEveryday; 
} 

public int getRappelEvenement() { 
    return this.rappelEvenement; 
} 

public void setRappelEvenement(int rappelEvenement) { 
    this.rappelEvenement = rappelEvenement; 
} 

public String getTitreEvenement() { 
    return this.titreEvenement; 
} 

public void setTitreEvenement(String titreEvenement) { 
    this.titreEvenement = titreEvenement; 
} 

public String getTypeEvenement() { 
    return this.typeEvenement; 
} 

public void setTypeEvenement(String typeEvenement) { 
    this.typeEvenement = typeEvenement; 
} 

public Integer getUtilCopieEvenement() { 
    return this.utilCopieEvenement; 
} 

public void setUtilCopieEvenement(int utilCopieEvenement) { 
    this.utilCopieEvenement = utilCopieEvenement; 
} 

}

有没有人有一个想法我错过了什么?

回答

2

区别不在于你调用persist,不同之处在于你调用em.flush()作为错误状态,要求将EntityManager加入到事务中。确保您的getListeEvenement()方法被封装在一个事务中,或者根据您的设置启动一个方法。

+0

有许多在服务器上获取或启动事务的示例。一个简单的例子就是在你的bean中使用@TransactionAttribute(TransactionAttributeType.REQUIRED),这里描述了一些其他的例子http://en.wikibooks.org/wiki/Java_Persistence/Transactions – Chris 2013-04-22 18:22:54

+0

@TransactionAttribute(TransactionAttributeType.REQUIRED)=> this不工作也许这是因为我试图注入一个类,而不是一个接口我读这个,但我不知道它是否是最新的==> http://www.adam-bien.com/roller/abien/entry/no_xml_dependency_injection_jpa。在文章中写道:“常见错误:您不能在EJB 3.0中注入类,而只能使用接口,这在EJB 3.1中会发生变化......”它仍然是真的吗? – user2198685 2013-04-22 21:08:02

相关问题