How do I solve this error when I perform a crud in spring boot?

2

I have a problem when I click on update a window appears and there I update the data but instead of updating it I create another record I do not know what to do next I leave the code:

Model

user class

@Entity public class User extends AbstractPersistable {

private transient Long id;

private String usuarioId;

private String usuarioNombre;

private String clave;

@ManyToOne
@JoinColumn(name="rol_id")
private Rol rol;


@OneToMany(targetEntity=Direccion.class, mappedBy="usuario", fetch=FetchType.LAZY,cascade=CascadeType.ALL)
private Set<Direccion> direcciones;



public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getUsuarioId() {
    return usuarioId;
}

public void setUsuarioId(String usuarioId) {
    this.usuarioId = usuarioId;
}

public String getUsuarioNombre() {
    return usuarioNombre;
}

public void setUsuarioNombre(String usuarioNombre) {
    this.usuarioNombre = usuarioNombre;
}

public String getClave() {
    return clave;
}

public void setClave(String clave) {
    this.clave = clave;
}

public Rol getRol() {
    return rol;
}

public void setRol(Rol rol) {
    this.rol = rol;
}

en la clase direccion

@Entity public class Address extends AbstractPersistable {

private String ciudad;
private String distrito;
private String pais;

private transient Long usuarioId;


@ManyToOne
@JoinColumn(name="usuario_id")
private Usuario usuario;




public Long getUsuarioId() {
    return usuarioId;
}
public void setUsuarioId(Long usuarioId) {
    this.usuarioId = usuarioId;
}
public String getCiudad() {
    return ciudad;
}
public void setCiudad(String ciudad) {
    this.ciudad = ciudad;
}
public String getDistrito() {
    return distrito;
}
public void setDistrito(String distrito) {
    this.distrito = distrito;
}
public String getPais() {
    return pais;
}
public void setPais(String pais) {
    this.pais = pais;
}
public Usuario getUsuario() {
    return usuario;
}
public void setUsuario(Usuario usuario) {
    this.usuario = usuario;
}

Controller

@RequestMapping("/direccion")
@Controller
@EnableGlobalMethodSecurity(prePostEnabled=true,securedEnabled = true, 
jsr250Enabled = true)
public class DireccionController {


    private DireccionService direccionService;

    private UsuarioService usuarioService;


    public DireccionController(DireccionService direccionService,UsuarioService usuarioService) {

        this.direccionService = direccionService;
        this.usuarioService=usuarioService;
    }



    @GetMapping("/actualizar/{id}")
    public String actualizarDireccion(@PathVariable Long id,Model model){
        model.addAttribute("direccion",direccionService.getDireccion(id));
        model.addAttribute("usuarios",usuarioService.getUsuario(id));
        model.addAttribute("usuarios",usuarioService.usuarioLista());
        return "direccion/lista";
    }


    @GetMapping("/lista")
    public String direccionLista(Model model) {
        model.addAttribute("direcciones",direccionService.direccionLista());
        model.addAttribute("usuarios",usuarioService.usuarioLista());
        return "direccion/lista";

    }

    @GetMapping("/lista/{id}")
    public Optional<Direccion> getDireccion(@PathVariable Long id){
        return direccionService.getDireccion(id);

    }


    @PostMapping("/agregar")
    @PreAuthorize("hasRole('admin')")
    public String agregarDireccion(@ModelAttribute("direcciones") Direccion direcciones,Model model)throws IOException {

        model.addAttribute("direcciones", direccionService.agregarDireccion(direcciones).getUsuario().getUsuarioNombre());
        return "redirect:/direccion/lista";

    }

    @GetMapping("/eliminar/{id}")
    public String eliminarDireccion(@PathVariable  Long id,Model model){
        model.addAttribute("mensaje",direccionService.eliminarDireccion(id));
        return "redirect:/direccion/lista";

    }   
}

JSP

<div class="container">
    <br>
         <button  class="btn btn-primary nBtn" >Nuevo</button>
          <br>
          <br>
    <div class="card">
    <div class="card-block">

    <table class="table table-hover table-bordered">
        <thead>
            <tr>
                <th>Codigo</th>
                <th>Ciudad</th>
                <th>Distrito</th>
                <th>Pais</th>
                <th>Usuario</th>
                <th>Actualizar</th>
                <th>Eliminar</th>   
            </tr>

        </thead>
        <tbody>
            <c:forEach items="${direcciones}" var="direccion">
                <tr>
                    <td>${direccion.id}</td>
                    <td>${direccion.ciudad}</td>
                    <td>${direccion.distrito}</td>
                    <td>${direccion.pais}</td>
                    <td>${direccion.usuario.usuarioNombre}</td>
                    <td><a href="${path}/direccion/actualizar/${direccion.id}" class="btn btn-primary eBtn">Actualizar</a></td>
                    <td><a href="${path}/direccion/eliminar/${direccion.id}"  class="btn btn-danger">Eliminar</a></td>
                </tr>

            </c:forEach>

        </tbody>



    </table>
    </div>
    </div>

  <div class="myForm">

    <form:form  action="${path}/direccion/agregar" method="post"  modelAttribute="<direcciones>,<usuarios>" >

    <div class="modal fade" id="exampleModal" 
        tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">

          <div class="modal-dialog" role="document">
            <div class="modal-content">
              <div class="modal-header">
                <h5 class="modal-title" id="exampleModalLabel">Actualizar o Guardar</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                  <span aria-hidden="true">&times;</span>
                </button>
              </div>
              <div class="modal-body">
                          <div class="form-group">
                    <label for="id" class="col-form-label">Codigo:</label>
                    <input type="text" class="form-control" id="id" name="id" value=""/>
                  </div>

                  <div class="form-group">
                    <label for="pais" class="col-form-label">Pais:</label>
                    <input type="text" class="form-control" id="pais" name="pais" value=""/>
                  </div>
                  <div class="form-group">
                    <label for="ciudad" class="col-form-label">Ciudad:</label>
                    <input type="text" class="form-control" id="ciudad" name="ciudad"  value=""/>
                  </div>
                   <div class="form-group">
                    <label for="distrito" class="col-form-label">Distrito:</label>
                    <input type="text" class="form-control" id="distrito" name="distrito" value=""/>
                  </div>

                   <div class="form-group">
                       <label for="usuario" class="col-form-label">Usuario:</label>

                        <select name="usuario.id" id="usuario" required>
                            <c:forEach items="${usuarios}" var="usuario" >

                                <option value="${usuario.id}">${usuario.usuarioNombre}</option>
                            </c:forEach>
                        </select>   
                    </div>



             </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-dismiss="modal">Cerrar</button>
                <input type="submit" class="btn btn-primary" value="guardar"/>
              </div>
            </div>

          </div>

        </div>
        </form:form>
      </div>    


</div>

JS

$(document).ready(function(){

    $('.nBtn, .table .eBtn').on('click',function(event){

        event.preventDefault();
        var href=$(this).attr('href');
        var text=$(this).text();

        if(text=='Actualizar' ){ 


        $.get(href,function(direccion,usuario,status){
            $('.myForm #id').val(direccion.id);
            $('.myForm #ciudad').val(direccion.ciudad);
            $('.myForm #distrito').val(direccion.distrito);
            $('.myForm #pais').val(direccion.ciudad);
            $('.myForm #usuario').val(direccion.usuario);
        });

        $('.myForm #exampleModal').modal();

    }else{

        $('.myForm #id').val('');
        $('.myForm #ciudad').val('');
        $('.myForm #distrito').val('');
        $('.myForm #pais').val('');
        $('.myForm #usuario').val('');

        $('.myForm #exampleModal').modal();
    }

    });
});

exit:

Hibernate: select address0_.id as id1_0_0_, address0_.city as city2_0_0_, address0_.district as district3_0_0_, address0_.pais as pais4_0_0_, address0_.user_id as user_5_0_0_, user1_.id as id1_3_1_, user1_.key as key2_3_1_, user1_. rol_id as rol_id5_3_1_, user1_.user_id as user_3_3_1_, user1_.user_name as user_4_3_1_, role2_.id as id1_2_2_, role2_.name as name2_2_2_ from address address0_ left outer join user user1_ on address0_.user_id = user1_.id left outer join role role2_on user1_ .rol_id = rol2_.id where address0_.id =? Hibernate: select user0_.id as id1_3_, user0_.key as key2_3_, user0_.rol_id as rol_id5_3_, user0_.user_id as user_3_3_, user0_.user_name as user_4_3_ from user user__ Hibernate: select next_val as id_val from hibernate_sequence for update Hibernate: update hibernate_sequence set next_val =? where next_val =? Hibernate: insert into address (city, district, country, user_id, id) values (?,?,?,?,?) Hibernate: select user0_.id as id1_3_0_, user0_.key as key2_3_0_, user0_.rol_id as rol_id5_3_0_, user0_.user_id as user_3_3_0_, user0_.user_name as user_4_3_0_, role1_.id as login1_2_1_, role1_.name as name2_2_1_ from user user0_ left outer join role rol1_ on user0_.rol_id = rol1_.id where user0_.id =? Hibernate: select address0_.id as id1_0_, address0_.city as city2_0_, address0_.district as district3_0_, address0_.pais as pais4_0_, address0_.user_id as user_5_0_ from address address0_ Hibernate: select user0_.id as id1_3_0_, user0_.key as key2_3_0_, user0_.rol_id as rol_id5_3_0_, user0_.user_id as user_3_3_0_, user0_.user_name as user_4_3_0_, role1_.id as login1_2_1_, role1_.name as name2_2_1_ from user user0_ left outer join role rol1_ on user0_.rol_id = rol1_.id where user0_.id =? Hibernate: select user0_.id as id1_3_, user0_.key as key2_3_, user0_.rol_id as rol_id5_3_, user0_.user_id as user_3_3_, user0_.user_name as user_4_3_ from user user0 _

    
asked by Libra2880 17.07.2018 в 00:38
source

2 answers

0

I already got the update button and add

In the Model I had to change the following code:

@Entity public class Address {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private transient Long usuarioId;

private String ciudad;
private String distrito;
private String pais;




public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}
@ManyToOne
@JoinColumn(name="usuario_id")
private Usuario usuario;




public Long getUsuarioId() {
    return usuarioId;
}
public void setUsuarioId(Long usuarioId) {
    this.usuarioId = usuarioId;
}
public String getCiudad() {
    return ciudad;
}
public void setCiudad(String ciudad) {
    this.ciudad = ciudad;
}
public String getDistrito() {
    return distrito;
}
public void setDistrito(String distrito) {
    this.distrito = distrito;
}
public String getPais() {
    return pais;
}
public void setPais(String pais) {
    this.pais = pais;
}
public Usuario getUsuario() {
    return usuario;
}
public void setUsuario(Usuario usuario) {
    this.usuario = usuario;
}
    
answered by 19.07.2018 / 12:03
source
0

In your case you have to make sure that the @PostMapping ("/ add") correctly receives the object you want to save and that it has an established ID when it is the case of updating, I'll give you a simple example that works:

Note: previously you had to upload in a form everything related to your case with the address and your user so that when you click on save you can call this function from the view.

    @PostMapping("/agregar")
    public String agregar(@Valid Cliente cliente, Model model) {

        String debug= (cliente.getId() != null)? "Cliente editado con éxito!" : "Cliente creado con éxito!";

        clienteService.save(cliente); //Crea o actualiza automaticamente

        return "listar";
    }

It is the same method to update as to add so it depends on the user id.

public interface IClienteService {
    public void save(Cliente cliente);
}

You will have the following function in the implementation of IClienteService :

@Service
public class ClienteServiceImpl implements IClienteService{
    @Override
    @Transactional
    public void save(Cliente cliente) {
        clienteDao.save(cliente);
    }
}

And the DAO will be as follows, very very simple:

public interface IClienteDao extends JpaRepository<Cliente, Long> {}

Once updated you will only have to redirect to the view where you make the list of the object that you have just updated.

Greetings.

    
answered by 17.07.2018 в 12:46