我有使用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;
}
}
有沒有人有一個想法我錯過了什麼?
有許多在服務器上獲取或啓動事務的示例。一個簡單的例子就是在你的bean中使用@TransactionAttribute(TransactionAttributeType.REQUIRED),這裏描述了一些其他的例子http://en.wikibooks.org/wiki/Java_Persistence/Transactions – Chris 2013-04-22 18:22:54
@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