Java 使用Hibernate、Primefaces和Spring更新记录

Java 使用Hibernate、Primefaces和Spring更新记录,java,spring,hibernate,jakarta-ee,primefaces,Java,Spring,Hibernate,Jakarta Ee,Primefaces,我正在使用集成spring3hibernate4jsf和primefaces。 在我的数据表中,我可以插入和删除记录,但我的更新代码不起作用,无法更新表和数据库。我不想使用primefaces单元格编辑器,我想要一个命令按钮执行更新。但当我单击命令按钮时,它会删除数据库和datatable中的单元格(字段),personel_id字段除外。请帮我找到正确的代码。 编辑字段并单击“更新”按钮时: personelDao.java public class PersonelDao implement

我正在使用集成
spring3
hibernate4
jsf
primefaces
。 在我的数据表中,我可以
插入
删除
记录,但我的更新代码不起作用,无法更新表和数据库。我不想使用primefaces
单元格编辑器
,我想要一个
命令按钮
执行更新。但当我单击命令按钮时,它会删除数据库和datatable中的单元格(字段),personel_id字段除外。请帮我找到正确的代码。 编辑字段并单击“更新”按钮时: personelDao.java

public class PersonelDao implements IPersonelDao {
    private SessionFactory sessionFactory;
    public void addPersonel(Personel personel) {
        getSessionFactory().getCurrentSession().save(personel);
    }
    public Personel updatePersonel(Personel personel) {

final Session session = getSessionFactory().getCurrentSession();
if(session.contains(personel)){
    session.update(personel);
} else {
    personel = (Personel) session.merge(personel);
}
return personel;
}
public void deletePersonel(Personel personel) {
            getSessionFactory().getCurrentSession().delete(personel);
        }
    }
@Transactional(readOnly=true)
public class PersonelService implements IPersonelService{
    IPersonelDao personeldao;
    @Transactional(readOnly=false)
    public void addPersonel(Personel personel) {
        getPersoneldao().addPersonel(personel);
    }

    @Transactional(readOnly=false)
    public void updatePersonel(Personel personel){
        getPersoneldao().updatePersonel(personel);
    }
    @Transactional(readOnly=false)
    public void deletePersonel(Personel personel) {
        getPersoneldao().deletePersonel(personel);
    }
}
@ManagedBean(name="personelMB")
@RequestScoped
public class PersonelBean implements Serializable{
    private static final long serialVersionUID = 1L;
    @ManagedProperty(value="#{PersonelService}")
    IPersonelService personelservice;
    List<Personel> personelList;
    private int personel_id;
    private String pname;
    private String pfamily;
    private String paddress;
    private String pphone;

    //getter and setter
    public void addPersonel(){
            Personel personel=new Personel();
            personel.setPaddress(getPaddress());
            personel.setPersonel_id(getPersonel_id());
            personel.setPfamily(getPfamily());
            personel.setPname(getPname());
            personel.setPphone(getPphone());
            getPersonelservice().addPersonel(personel);
            reset();
    }

    public void deletePersonel(int personel_id){
            Personel personel=(Personel)personelservice.getPersonelId(personel_id);
            getPersonelservice().deletePersonel(personel);
    }

    public void update(int personel_id){
        Personel personel=(Personel)personelservice.getPersonelId(personel_id);
        personel.setPaddress(getPaddress());
        personel.setPfamily(getPfamily());
        personel.setPname(getPname());
        personel.setPphone(getPphone());
        getPersonelservice().updatePersonel(personel);
    }
}
@Entity
@Table(name="TBLPERSONEL")
public class Personel {
    @Id
    @Column(name="PERSONEL_ID")
    private int personel_id;
    @Column(name="PNAME")
    private String pname;
    @Column(name="PFAMILY")
    private String pfamily;
    @Column(name="PADDRESS")
    private String paddress;
    @Column(name="PPHONE")
    private String pphone;
    @OneToOne
    @PrimaryKeyJoinColumn
    private Manager manager;
    @OneToMany(mappedBy="personel")
    private Set<Stufftransfer> stufftransfers;
    public Personel(){

    }
    //getter and setter
}
personelservice.java

public class PersonelDao implements IPersonelDao {
    private SessionFactory sessionFactory;
    public void addPersonel(Personel personel) {
        getSessionFactory().getCurrentSession().save(personel);
    }
    public Personel updatePersonel(Personel personel) {

final Session session = getSessionFactory().getCurrentSession();
if(session.contains(personel)){
    session.update(personel);
} else {
    personel = (Personel) session.merge(personel);
}
return personel;
}
public void deletePersonel(Personel personel) {
            getSessionFactory().getCurrentSession().delete(personel);
        }
    }
@Transactional(readOnly=true)
public class PersonelService implements IPersonelService{
    IPersonelDao personeldao;
    @Transactional(readOnly=false)
    public void addPersonel(Personel personel) {
        getPersoneldao().addPersonel(personel);
    }

    @Transactional(readOnly=false)
    public void updatePersonel(Personel personel){
        getPersoneldao().updatePersonel(personel);
    }
    @Transactional(readOnly=false)
    public void deletePersonel(Personel personel) {
        getPersoneldao().deletePersonel(personel);
    }
}
@ManagedBean(name="personelMB")
@RequestScoped
public class PersonelBean implements Serializable{
    private static final long serialVersionUID = 1L;
    @ManagedProperty(value="#{PersonelService}")
    IPersonelService personelservice;
    List<Personel> personelList;
    private int personel_id;
    private String pname;
    private String pfamily;
    private String paddress;
    private String pphone;

    //getter and setter
    public void addPersonel(){
            Personel personel=new Personel();
            personel.setPaddress(getPaddress());
            personel.setPersonel_id(getPersonel_id());
            personel.setPfamily(getPfamily());
            personel.setPname(getPname());
            personel.setPphone(getPphone());
            getPersonelservice().addPersonel(personel);
            reset();
    }

    public void deletePersonel(int personel_id){
            Personel personel=(Personel)personelservice.getPersonelId(personel_id);
            getPersonelservice().deletePersonel(personel);
    }

    public void update(int personel_id){
        Personel personel=(Personel)personelservice.getPersonelId(personel_id);
        personel.setPaddress(getPaddress());
        personel.setPfamily(getPfamily());
        personel.setPname(getPname());
        personel.setPphone(getPphone());
        getPersonelservice().updatePersonel(personel);
    }
}
@Entity
@Table(name="TBLPERSONEL")
public class Personel {
    @Id
    @Column(name="PERSONEL_ID")
    private int personel_id;
    @Column(name="PNAME")
    private String pname;
    @Column(name="PFAMILY")
    private String pfamily;
    @Column(name="PADDRESS")
    private String paddress;
    @Column(name="PPHONE")
    private String pphone;
    @OneToOne
    @PrimaryKeyJoinColumn
    private Manager manager;
    @OneToMany(mappedBy="personel")
    private Set<Stufftransfer> stufftransfers;
    public Personel(){

    }
    //getter and setter
}
personelbean.java

public class PersonelDao implements IPersonelDao {
    private SessionFactory sessionFactory;
    public void addPersonel(Personel personel) {
        getSessionFactory().getCurrentSession().save(personel);
    }
    public Personel updatePersonel(Personel personel) {

final Session session = getSessionFactory().getCurrentSession();
if(session.contains(personel)){
    session.update(personel);
} else {
    personel = (Personel) session.merge(personel);
}
return personel;
}
public void deletePersonel(Personel personel) {
            getSessionFactory().getCurrentSession().delete(personel);
        }
    }
@Transactional(readOnly=true)
public class PersonelService implements IPersonelService{
    IPersonelDao personeldao;
    @Transactional(readOnly=false)
    public void addPersonel(Personel personel) {
        getPersoneldao().addPersonel(personel);
    }

    @Transactional(readOnly=false)
    public void updatePersonel(Personel personel){
        getPersoneldao().updatePersonel(personel);
    }
    @Transactional(readOnly=false)
    public void deletePersonel(Personel personel) {
        getPersoneldao().deletePersonel(personel);
    }
}
@ManagedBean(name="personelMB")
@RequestScoped
public class PersonelBean implements Serializable{
    private static final long serialVersionUID = 1L;
    @ManagedProperty(value="#{PersonelService}")
    IPersonelService personelservice;
    List<Personel> personelList;
    private int personel_id;
    private String pname;
    private String pfamily;
    private String paddress;
    private String pphone;

    //getter and setter
    public void addPersonel(){
            Personel personel=new Personel();
            personel.setPaddress(getPaddress());
            personel.setPersonel_id(getPersonel_id());
            personel.setPfamily(getPfamily());
            personel.setPname(getPname());
            personel.setPphone(getPphone());
            getPersonelservice().addPersonel(personel);
            reset();
    }

    public void deletePersonel(int personel_id){
            Personel personel=(Personel)personelservice.getPersonelId(personel_id);
            getPersonelservice().deletePersonel(personel);
    }

    public void update(int personel_id){
        Personel personel=(Personel)personelservice.getPersonelId(personel_id);
        personel.setPaddress(getPaddress());
        personel.setPfamily(getPfamily());
        personel.setPname(getPname());
        personel.setPphone(getPphone());
        getPersonelservice().updatePersonel(personel);
    }
}
@Entity
@Table(name="TBLPERSONEL")
public class Personel {
    @Id
    @Column(name="PERSONEL_ID")
    private int personel_id;
    @Column(name="PNAME")
    private String pname;
    @Column(name="PFAMILY")
    private String pfamily;
    @Column(name="PADDRESS")
    private String paddress;
    @Column(name="PPHONE")
    private String pphone;
    @OneToOne
    @PrimaryKeyJoinColumn
    private Manager manager;
    @OneToMany(mappedBy="personel")
    private Set<Stufftransfer> stufftransfers;
    public Personel(){

    }
    //getter and setter
}

仅在方法中定义事务性并分配传播,如果在类上定义“transactional”,则这适用于所有方法

personelservice.java的更改:

//@Transactional(readOnly=true)
public class PersonelService implements IPersonelService{
    IPersonelDao personeldao;
    @Transactional(propagation=Propagation.REQUIRED)
    public void addPersonel(Personel personel) {
        getPersoneldao().addPersonel(personel);
    }

    @Transactional(propagation=Propagation.REQUIRED)
    public void updatePersonel(Personel personel){
        getPersoneldao().updatePersonel(personel);
    }

    @Transactional(propagation=Propagation.REQUIRED)
    public void deletePersonel(Personel personel) {
        getPersoneldao().deletePersonel(personel);
    }
}
雷加特

马努·纳瓦罗


PS:请原谅我的英语小流体

为防止更新时出现会话丢失问题,dao中的更改:

public class PersonelDao implements IPersonelDao {
    ...
    public Personel updatePersonel(Personel personel) {
        final Session session = getSessionFactory().getCurrentSession();
        if(session.contains(personel)){
            session.update(personel);
        } else {
            personel = (Personel) session.merge(personel);
        }
        return personel;
    }
    ...
}
因此,如果实体不在会话中,将强制将其与合并链接

您还必须检索合并返回的对象,您可能必须强制并更改内存中的引用


问候,

亲爱的马努,谢谢你的回复。我照你说的做了,但我的问题没有解决。亲爱的马努,谢谢你的关注。但它也不起作用。我真的很困惑。当我编辑数据表单元格并单击“更新命令”按钮时,数据将从数据库和数据表行中删除。Manu,我已经编辑了添加跟踪后的日志。请你看一下好吗。特别感谢在调试模式下启动它,希望传递正确的行,如果它给出错误,附加的错误和发生错误的行。我的英语水平不够,你会说西班牙语吗?现在我不能,我可以在8小时内,20:00 UTC+1