Java 如何使用.remove和.flush从数据库中删除最后一行

Java 如何使用.remove和.flush从数据库中删除最后一行,java,mysql,database,flush,Java,Mysql,Database,Flush,我必须使用.remove和.flush从数据库(使用MySQL创建)中删除最后一行,但它一直告诉我该行没有被删除。我试着用不同的方式来写,但我看不出它能起作用。任何帮助都将不胜感激!代码如下: package com.vz.test.mbean; import com.vz.test.db.Person; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; im

我必须使用.remove和.flush从数据库(使用MySQL创建)中删除最后一行,但它一直告诉我该行没有被删除。我试着用不同的方式来写,但我看不出它能起作用。任何帮助都将不胜感激!代码如下:

package com.vz.test.mbean;

import com.vz.test.db.Person;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@ManagedBean
@ViewScoped
public class AddPerson {

    com.vz.test.db.Person person = null;
    private int identification = 0;
    private String name = "";
    private String age = "";
    private String telephone = "";
    private String results="";
    private java.util.List<Person> alst = new java.util.ArrayList<Person>();

    public java.util.List<Person> getAlst() {
        return alst;
    }

    public void setAlst(ArrayList<Person> alst) {
        this.alst = alst;
    }


    public String getResults() {
        return results;
    }

    public void setResults(String results) {
        this.results = results;
    }




    @PersistenceContext(unitName = "WebApplication2PU")
    private EntityManager em;
    @Resource
    private javax.transaction.UserTransaction utx;

    public int getIdentification() {
        return identification;
    }

    public void setIdentification(int identification) {
        this.identification = identification;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }


    public AddPerson() {
    }

    public void fetchPersonList(){
     Query qu = em.createQuery("SELECT a FROM Person a");  
     alst= (java.util.List<Person>) q.getResultsList();
        System.out.println("alst.size():"+ alst.size());
    }

    public void addRow() {
        try {
            System.out.println("I am in addRow");
            com.vz.test.db.Person person = new com.vz.test.db.Person();
            person.setName(name);
            person.setAge(age);
            person.setTelephone(telephone);
            persist(person);
            result="Row is added";

        }
        catch (Exception e) {
            result="Row is NOT added";
        }
    }

    public void deleteRow(){

        try{
        em.remove(person);
        em.flush();
        persist(person);
        result="Row is deleted";
        }
        catch (Exception e){
            result="Row is NOT deleted";
        }

    }

    public void persist(Object object) {
        try {
            utx.begin();
            em.persist(object);
            utx.commit();
        } catch (Exception e) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", e);
            throw new RuntimeException(e);
        }
    }
}
package com.vz.test.mbean;
导入com.vz.test.db.Person;
导入java.util.ArrayList;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.annotation.Resource;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.ViewScoped;
导入javax.persistence.EntityManager;
导入javax.persistence.PersistenceContext;
导入javax.persistence.Query;
@ManagedBean
@视域
公共类AddPerson{
com.vz.test.db.Person=null;
私有int标识=0;
私有字符串名称=”;
私人字符串年龄=”;
专用电话线=”;
私有字符串结果=”;
private java.util.List alst=new java.util.ArrayList();
public java.util.List getAlst(){
返回alst;
}
公共无效setAlst(ArrayList alst){
this.alst=alst;
}
公共字符串getResults(){
返回结果;
}
公共void setResults(字符串结果){
这个结果=结果;
}
@PersistenceContext(unitName=“WebApplication2PU”)
私人实体管理者;
@资源
私有javax.transaction.UserTransaction utx;
公共int getIdentification(){
退货标识;
}
公共标识(内部标识){
这个。识别=识别;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getAge(){
回归年龄;
}
公共无效设置(字符串期限){
这个。年龄=年龄;
}
公共字符串getTelephone(){
回电;
}
公用电话(串电话){
这个电话;
}
公众人物(){
}
public void fetchPersonList(){
Query qu=em.createQuery(“从人员a中选择一个”);
alst=(java.util.List)q.getResultsList();
System.out.println(“alst.size():”+alst.size());
}
public void addRow(){
试一试{
System.out.println(“我在addRow”);
com.vz.test.db.Person Person=新建com.vz.test.db.Person();
person.setName(name);
人.体位(年龄);
个人电话(电话);
坚持(人);
结果=“行已添加”;
}
捕获(例外e){
结果=“未添加行”;
}
}
public void deleteRow(){
试一试{
移除(人);
em.flush();
坚持(人);
结果=“行已删除”;
}
捕获(例外e){
result=“行未被删除”;
}
}
公共void持久化(对象){
试一试{
utx.begin();
em.persist(object);
提交();
}捕获(例外e){
Logger.getLogger(getClass().getName()).log(Level.severy,“捕获异常”,e);
抛出新的运行时异常(e);
}
}
}
首先删除实体,然后尝试将其持久化。改为将remove调用包装在用户事务中,这样可以解决问题:

    try {
      if (person != null) {
        utx.begin();
        em.remove(person);
        utx.commit();
        result="Row is deleted";
      } else {
        System.out.println("The field 'person' is null. Can't remove anything");
      }
    }
    catch (Exception e) {
      // TODO add proper exception handling/logging 
      result="Row is NOT deleted";
    }

“最后一排”叫什么?一张桌子根本不知道行顺序。谢谢你的帮助!我尝试了你的建议,但是程序仍然说行没有被删除。你得到了什么异常(这就是我添加TODO注释的原因)java.io.NotSerializableException:com.vz.test.mbean.AddPersonjava.lang.IllegalArgumentException:Object:null不是已知的实体类型。最后一个是最重要的<调用remove方法时,code>person为
null
。我已经更新了代码,请试试。
    try {
      if (person != null) {
        utx.begin();
        em.remove(person);
        utx.commit();
        result="Row is deleted";
      } else {
        System.out.println("The field 'person' is null. Can't remove anything");
      }
    }
    catch (Exception e) {
      // TODO add proper exception handling/logging 
      result="Row is NOT deleted";
    }