更新函数就像我的Add Function(Spring,Hibernate,mvc)一样工作

时间:2014-03-14 10:03:12

标签: java hibernate spring-mvc crud insert-update

我是SH mvc的新手,我学习了春天的hibernate mvc,我做了CRUD实现,但是当我尝试更新功能时,数据库不会改变,但看起来就像我在数据库中创建新数据。我应该怎么做

This data will be changed

- i rename the name with : hello world and i click update..

This is the result, "sasazaki mami" Data is still here and is not renewable with "Hello World" data

这是我的控制器

     package com.list.satu;

     import java.util.List;

     import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

      import javax.servlet.http.HttpServletRequest;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.validation.BindingResult;
    import org.springframework.validation.Validator;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;

    import com.list.satu.entity.Anggota;
    import com.list.satu.service.AnggotaService;

    @Controller
    @RequestMapping("test")
    public class AnggotaController {
private static final Logger logger = LoggerFactory
        .getLogger(AnggotaController.class);

private AnggotaService anggotaService;
private Validator validator;

@Autowired
public void setAnggotaService(AnggotaService anggotaService) {
    this.anggotaService = anggotaService;
}

@Autowired
public void setValidator(Validator validator) {
    this.validator = validator;
}

@RequestMapping(value = "/anggota", method = RequestMethod.GET)
public String search(Model model) {
    List<Anggota> anggota = anggotaService.getAllAnggota();
    model.addAttribute("anggota", anggota);

    return "test/anggota";
}

@RequestMapping(value = "/add", method = RequestMethod.GET)
public String addNew(Model model) {
    model.addAttribute("anggota", new Anggota());
    return "test/add";
}

@RequestMapping(value = "/add", method = RequestMethod.POST)
public String save(Anggota anggota, Model model, BindingResult errors,
        HttpServletRequest request) {
    if (validator != null) {
        validator.validate(anggota, errors);
    }
    if (errors.hasErrors()) {

        return "test/add";
    }
    this.anggotaService.save(anggota);
    return "redirect:/test/anggota";
}

@RequestMapping(value = "/edit/{npm}", method = RequestMethod.GET)
public String editRecord(@PathVariable("npm") Integer kode, Model model,
        HttpServletRequest request) {
    logger.info("Received npm" + kode.toString());
    Anggota anggota = this.anggotaService.getById(kode);
    model.addAttribute("anggota", anggota);
    return "test/edit";
}

@RequestMapping(value = "/edit/{npm}", method = RequestMethod.POST)
public String edit(@ModelAttribute Anggota anggota, Model model,
        BindingResult errors, HttpServletRequest request,
        @PathVariable Integer npm) {

    if (validator != null) {
        validator.validate(anggota, errors);
    }
    if (errors.hasErrors()) {

        return "test/anggota";
    }
    anggota.setNpm(npm);
    this.anggotaService.update(anggota);

    System.out.println(anggota.getNpm());
    System.out.println(anggota.getNama());
    System.out.println(anggota.getUmur());

    return "redirect:/test/anggota";
}
    }

我的Dao实施

package com.list.satu.dao.im;

    import java.util.List;

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.orm.hibernate3.HibernateTemplate;
    import org.springframework.stereotype.Repository;

    import com.list.satu.dao.AnggotaDao;
    import com.list.satu.entity.Anggota;


        @Repository
     public class AnggotaDaoim implements AnggotaDao{
private HibernateTemplate hibernateTemplate;
@Autowired
private SessionFactory sessionFactory;

public List<Anggota> getAllAnggota(){
    Session session = sessionFactory.getCurrentSession();
    return session.createQuery("FROM Anggota").list();
}

public List<Anggota> getAllAnggotaDetails() {
    Session session = sessionFactory.getCurrentSession();
    return session.createQuery("FROM Anggota a LEFT JOIN FETCH a.flight").list();
}

public Anggota getAnggota(Anggota anggota) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void save(Anggota anggota) {
    // TODO Auto-generated method stub
    Session session = sessionFactory.getCurrentSession();
    session.merge(anggota);
}

@Override
public void update(Anggota anggota) {
    // TODO Auto-generated method stub
    Session session = sessionFactory.getCurrentSession();
    session.saveOrUpdate(anggota);
}

@Override
public Anggota getById(Integer kode) {
    // TODO Auto-generated method stub
    return (Anggota) this.sessionFactory.getCurrentSession().get(Anggota.class, kode);
}

@Override
public void remove(Anggota anggota) {
    // TODO Auto-generated method stub
    Session session = sessionFactory.getCurrentSession();
    session.delete(anggota);

      }}

我的服务实施

    package com.list.satu.service.im;

     import java.util.List;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;

    import com.list.satu.dao.AnggotaDao;
    import com.list.satu.entity.Anggota;
    import com.list.satu.service.AnggotaService;

    @Service
    public class AnggotaServiceIm implements AnggotaService{

@Autowired
private AnggotaDao anggotaDao;

public AnggotaDao getAnggotaDao() {
    return anggotaDao;
}

public void setAnggotaDao(AnggotaDao anggotaDao) {
    this.anggotaDao = anggotaDao;
}

@Transactional
public List<Anggota> getAnggotaDetails() {
    return anggotaDao.getAllAnggotaDetails();
}

@Transactional
public List<Anggota> getAllAnggota() {
    // TODO Auto-generated method stub
    return anggotaDao.getAllAnggota();
}

@Transactional
public void save(Anggota anggota) {
    // TODO Auto-generated method stub
    anggotaDao.save(anggota);
}

@Override
@Transactional
public void update(Anggota anggota) {
    // TODO Auto-generated method stub
    anggotaDao.update(anggota);
}

@Override
@Transactional
public Anggota getById(Integer kode) {
    // TODO Auto-generated method stub
    return anggotaDao.getById(kode);
}

@Override
@Transactional
public void remove(Anggota anggota) {
    // TODO Auto-generated method stub
    anggotaDao.remove(anggota);
}


    }

我的jsp动作

    <form:form role="form" action="/satu/test/edit/${npm}"
commandName="anggota" method="post">
  

^^之前的感谢

1 个答案:

答案 0 :(得分:2)

试试这个

@Override
public void update(Anggota externalAnggota) {
    Session session = sessionFactory.getCurrentSession();

    Anggota dbAnggota = (Anggota)session.load(Anggota.class, externalAnggota.getId());

 //now set all your values from exteralAnggota instance  to dbAnggota instance.  
  dbAnggota.setName(exteralAnggota.getName());

  //Set for all the fields 

   session.saveOrUpdate(dbAnggota);
}

原因您传递给会话的对象不是会话的一部分,因此hibernate引擎将其视为新实例并创建新行。 saveOrUpdate()方法基于以下条件工作

1)如果对象在当前会话中已经持久化,那么它就是     没什么

2)如果与会话关联的另一个对象具有相同的对象       标识符,向调用者抛出异常

3)如果对象没有标识符属性,则保存()对象

4)如果对象的标识符具有分配给新实例化对象的值,则保存()对象

希望这有用!