通过JSF + EJB应用程序持久化时在DB中获取null参数

时间:2015-06-27 21:21:19

标签: jpa primefaces ejb

我正在创建我的第一个JSF+EJB应用程序测试,当我以jsf形式插入基本数据时点击<p:commandButton/>,除了一个输入外,任务正确完成。在表单中,我有2个输入字段,#1在我的db.table中设置为VARCHAR,#2是INT,但它们都是<p:inputText/>。与他们的对应和EL

在验证DB中持久保存的信息时,只有#1字段正确存在,#2设置为,我不明白为什么。

我已经完成了以前的应用程序,我使用Hibernate来保持持久性,这很好用,我在Annotation模块中遗漏了一些@EJB或其他内容吗?

这是我的代码:

<h:form>
        <p:panelGrid columns="2" >                
            <p:outputLabel value="Owner"/>
            <p:inputText value="#{accountMB.account.ownername}"/>
            <p:outputLabel value="Balance"/>
            <p:inputText value="#{accountMB.account.balance}"/>
        </p:panelGrid>
            <p:commandButton value="Create Account" action="#{accountMB.commandButton()}" ajax="false"/>        
    </h:form>

ManagedBean:

    @ManagedBean
@RequestScoped
public class AccountMB {

    @EJB
    private AccountFacade facade;
    private Account account;

    public AccountMB() {

    }
    @PostConstruct
    public void init(){
        this.account = new Account();
    }

      // setters .. getters ... 

    public String commandButton(){
        facade.openAccount(this.account.getOwnername(), this.account.getBalance());
        return "response?faces-redirect=true";
    }
}

会话bean:

    @Stateless
public class AccountFacade extends AbstractFacade<Account> {
    @PersistenceContext(unitName = "bankAppPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public AccountFacade() {
        super(Account.class);
    }

    public Account openAccount(String ownername, int balance){
        Account ac = new Account(balance, ownername);
        em.persist(ac);
        return ac;
    }
    public void closeAccount(int accountNumber){
            Account ac = em.find(Account.class, accountNumber);
            if(ac != null)
                em.remove(ac);            
    }
    public void deposit(int accountNumber, int amount){
            Account ac = em.find(Account.class, accountNumber);
            if(ac != null)
                ac.deposit(amount);
    }
    public int withdraw(int accountNumber, int amount){
            Account ac = em.find(Account.class, accountNumber);
            return (ac != null)? ac.withdraw(amount): 0;
    }
    public List<Account> listAccounts(){
         return em.createNamedQuery("Account.findAll").getResultList();
    }    
}

实体bean:

  @Entity
@Table(name = "account")
@NamedQueries({
    @NamedQuery(name = "Account.findAll", query = "SELECT a FROM Account a")})
public class Account implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID")
    private Integer id;
    @Column(name = "BALANCE")
    private Integer balance;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 100)
    @Column(name = "OWNERNAME")
    private String ownername;

    public Account() {
    }

    public Account(Integer id) {
        this.id = id;
    }

    public Account(Integer id, String ownername) {
        this.id = id;
        this.ownername = ownername;
    }
// setters ..  getters ..                     
    public void deposit(int amount){
        this.balance += amount;
    }
    public int withdraw(int amount){
        return (amount > this.balance)? 0 : (this.balance-=amount);
    }      

}

2 个答案:

答案 0 :(得分:0)

<p:inputText value="#{accountMB.account.balance}" converter="javax.faces.Integer" /> 

public String commandButton(){
        facade.openAccount(this.account.getOwnername(), Integer.parseInt(this.account.getBalance()));
        return "response?faces-redirect=true";
    }

答案 1 :(得分:0)

在应用程序的几个地方打印balance后,我的错误就在数据库本身,因为我意外地设置了BALANCE INT(11)所以任何比它设置的格式更大的数字将是设为null