我使用JSF2.0與EJB和JPA。 我已經嘗試使用EJB Facade的create方法添加新記錄,並且沒有任何問題。使用EJB Facade的create()方法,使用JSF的JPA不會持久化新記錄。沒有錯誤返回
但是現在我不能在我的表格中添加一個類型爲Question的新記錄。 我會將代碼發佈到我的實體,控制器和EJB外觀文件,但我想補充一點,我的Question實體具有一個名爲Questionnaid類型Questionnaire的外鍵。
新記錄沒有添加,我在任何嘗試中都沒有收到任何錯誤。 即使我的問卷ID已正確返回。唯一沒有完成的是persist()。
下面是我的控制器中創建方法:
public void createMultipleChoiceSingleAnswerQuestion() {
try {
currentQuestion = new Question();
currentQuestion.setId(0);
currentQuestion.setQuestionnaireid(currentQuestionnaire);
getFacade().create(currentQuestion);
//System.out.println("QUESTIONNAIRE IIIIIIIDDDDDDDDDDD: "+currentQuestionnaire.getId());
//getFacade().create(q);
} catch (Exception e) {
System.out.println("ERRORRRR: "+e.getMessage());
}
}
我的問題是實體:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package model;
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
/**
*
* @author Pedram
*/
@Entity
@Table(name = "question")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Question.findAll", query = "SELECT q FROM Question q"),
@NamedQuery(name = "Question.findById", query = "SELECT q FROM Question q WHERE q.id = :id"),
@NamedQuery(name = "Question.findByType", query = "SELECT q FROM Question q WHERE q.type = :type"),
@NamedQuery(name = "Question.findByMandatory", query = "SELECT q FROM Question q WHERE q.mandatory = :mandatory"),
@NamedQuery(name = "Question.findByOrdernumber", query = "SELECT q FROM Question q WHERE q.ordernumber = :ordernumber"),
@NamedQuery(name = "Question.findByWeight", query = "SELECT q FROM Question q WHERE q.weight = :weight"),
@NamedQuery(name = "Question.findByQuestionnaire", query = "SELECT q FROM Question q WHERE q.questionnaireid = :questionnaireid"),
@NamedQuery(name = "Question.findByTag", query = "SELECT q FROM Question q WHERE q.tag = :tag")})
public class Question implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@NotNull
@Column(name = "id")
private Integer id;
@Size(max = 40)
@Column(name = "type")
private String type;
@Lob
@Size(max = 65535)
@Column(name = "questiontext")
private String questiontext;
@Lob
@Size(max = 65535)
@Column(name = "answertext")
private String answertext;
@Column(name = "mandatory")
private Boolean mandatory;
@Lob
@Size(max = 65535)
@Column(name = "correctanswer")
private String correctanswer;
@Column(name = "ordernumber")
private Integer ordernumber;
@Column(name = "weight")
private Integer weight;
@Size(max = 40)
@Column(name = "tag")
private String tag;
@OneToMany(mappedBy = "questionid")
private Collection<Textanswer> textanswerCollection;
@JoinColumn(name = "questionnaireid", referencedColumnName = "id")
@ManyToOne
private Questionnaire questionnaireid;
@OneToMany(mappedBy = "questionid")
private Collection<Choiceanswer> choiceanswerCollection;
public Question() {
}
public Question(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getQuestiontext() {
return questiontext;
}
public void setQuestiontext(String questiontext) {
this.questiontext = questiontext;
}
public String getAnswertext() {
return answertext;
}
public void setAnswertext(String answertext) {
this.answertext = answertext;
}
public Boolean getMandatory() {
return mandatory;
}
public void setMandatory(Boolean mandatory) {
this.mandatory = mandatory;
}
public String getCorrectanswer() {
return correctanswer;
}
public void setCorrectanswer(String correctanswer) {
this.correctanswer = correctanswer;
}
public Integer getOrdernumber() {
return ordernumber;
}
public void setOrdernumber(Integer ordernumber) {
this.ordernumber = ordernumber;
}
public Integer getWeight() {
return weight;
}
public void setWeight(Integer weight) {
this.weight = weight;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
@XmlTransient
public Collection<Textanswer> getTextanswerCollection() {
return textanswerCollection;
}
public void setTextanswerCollection(Collection<Textanswer> textanswerCollection) {
this.textanswerCollection = textanswerCollection;
}
public Questionnaire getQuestionnaireid() {
return questionnaireid;
}
public void setQuestionnaireid(Questionnaire questionnaireid) {
this.questionnaireid = questionnaireid;
}
@XmlTransient
public Collection<Choiceanswer> getChoiceanswerCollection() {
return choiceanswerCollection;
}
public void setChoiceanswerCollection(Collection<Choiceanswer> choiceanswerCollection) {
this.choiceanswerCollection = choiceanswerCollection;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Question)) {
return false;
}
Question other = (Question) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "model.Question[ id=" + id + " ]";
}
}
這是我的EJB外觀類:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package facade;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import model.Question;
import model.Questionnaire;
/**
*
* @author Pedram
*/
@Stateless
public class QuestionFacade extends AbstractFacade<Question> {
@PersistenceContext(unitName = "MobileSamplingToolkit0.4PU")
private EntityManager em;
List<Question> results = null;
@Override
protected EntityManager getEntityManager() {
return em;
}
public QuestionFacade() {
super(Question.class);
}
public List<Question> getQuestionsByQuestionnaire(Questionnaire questionnaire){
try {
em = Persistence.createEntityManagerFactory("MobileSamplingToolkit0.4PU").createEntityManager();
Query query = em.createNamedQuery("Question.findByQuestionnaire");
query.setParameter("questionnaireid", questionnaire);
results = query.getResultList();
} catch (Exception e) {
System.out.println("ERROR IN Question FACADE:" + e.getMessage());
}
return results;
}
}
我的門面實現AbstractFacade。下面的代碼到抽象門面:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package facade;
import java.util.List;
import javax.persistence.EntityManager;
/**
*
* @author Pedram
*/
public abstract class AbstractFacade<T> {
private Class<T> entityClass;
public AbstractFacade(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected abstract EntityManager getEntityManager();
public void create(T entity) {
getEntityManager().persist(entity);
}
public void edit(T entity) {
getEntityManager().merge(entity);
}
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
}
public T find(Object id) {
return getEntityManager().find(entityClass, id);
}
public List<T> findAll() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
return getEntityManager().createQuery(cq).getResultList();
}
public List<T> findRange(int[] range) {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
javax.persistence.Query q = getEntityManager().createQuery(cq);
q.setMaxResults(range[1] - range[0]);
q.setFirstResult(range[0]);
return q.getResultList();
}
public int count() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
cq.select(getEntityManager().getCriteriaBuilder().count(rt));
javax.persistence.Query q = getEntityManager().createQuery(cq);
return ((Long) q.getSingleResult()).intValue();
}
}
通過我剛啓用了JPA的日誌,並意識到,通過點擊創建按鈕,沒有執行INSERT查詢的方式。而我的應用程序的其他部分插入記錄沒有問題。
你的外觀的創建方法在哪裏? – Csaba
我的門面實現了AbstractFacade。我在上面的代碼中添加了這個類。順便說一下,我啓用了JPA日誌記錄,並意識到通過單擊創建按鈕不會執行INSERT查詢。而我的應用程序的其他部分插入記錄沒有問題。 – Disasterkid