java - 更新功能像我的添加功能一样工作(Spring,Hibernate,mvc)

标签 java hibernate spring-mvc crud insert-update

我是SH mvc新手,我学习spring 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

这是我的 Controller

     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 工具

包 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">

Thanksss before ^^

最佳答案

尝试这样

@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);
}

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

1)如果该对象已经在当前 session 中持久化,则它会执行 什么都没有

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

3)如果对象没有identifier属性,则save()该对象

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

希望这对您有帮助!

关于java - 更新功能像我的添加功能一样工作(Spring,Hibernate,mvc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22401753/

相关文章:

java - android photo 是否在元数据中存储罗盘信息,如果没有怎么办?

java - 达到 hibernate.c3p0.timeout 后数据库连接会发生什么?

java - hibernate二级缓存很慢

hibernate - 计算 Hibernate SQLProjection 中聚合列的排名

Hibernate 单向一对多关联 - 为什么连接表更好?

spring-mvc - 用于 Restful 和正常的 Spring MVC ExceptionHandler

java - 是否有异常(exception),可以让我处理用户尝试为 UUID 输入过多字符的情况?

java - 如何在运行时修改 Camel 端点

java - 如何在 gridLayout 中以编程方式设置列号和行号?

java - 在 Java 中并行化阻塞调用