我是SH mvc的新手,我学习了春天的hibernate mvc,我做了CRUD实现,但是当我尝试更新功能时,数据库不会改变,但看起来就像我在数据库中创建新数据。我应该怎么做
这是我的控制器
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">
^^之前的感谢
答案 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)如果对象的标识符具有分配给新实例化对象的值,则保存()对象
希望这有用!