Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Alteração em vários objetos do modelo quando salvar um objeto

Pessoal, tenho uma dúvida: Estou usando SPRING MVC com Spring Data, implementei os controllers e os repositórios herdando de JPARepository. Não implementei os métodos do JPARepository, deixando-os no padrão.

No meu modelo tenho o seguinte:

@Entity
public class Name{
   @Id @GeneratedValue(strategy = GenerationType.AUTO)
   private  int id;
   @NulNull @NotEmpty
   private String myName;
   //Getters and Setters
}

@Entity
public class B{
   @Id @GeneratedValue(strategy = GenerationType.AUTO)
   private int id;
   @NotNull @NotValid
   private int bName;
   private int nextB;
}

Com a qual quero criar uma lista de B's onde os nomes dos B's estão numa tabela Name e cada B aponta para essa tabela, não repetindo assim os nomes dos B's.

No meu controller, tenho o seguinte:

@Controller
public class GeneralController{

    //Consider I have a package repository into package project where I extend BRepository and NameRepository interfaces from JPARepository correctly (I can persist B or name in a independent form)

    @Autowired
    BRepository allBs;
    @Autowired
    NameRepository allNames;

    @GetMapping("create") ModelAndView getCreationPage(Name n, B b){
        ModelAndView mv = new ModelAndView("formCreate");
        //Consider I have a JSP file 'formCreate.jsp' into webapp/WEB-INFO/jsp like we learn in this course

        mv.addObject("name", n);
        mv.addObject("b", b);

        return mv;
    }

    @PostMapping("create") ModelAndView addFirstB(@Valid Name n, @Valid B b){
        ModelAndView mv = new ModelAndView("formCreate");

        //------------------------------------------
        //What I want to do here:

        allNames.save(n); //now n have an Id
        b.setBName(n.getId()); //now B points to its name in table name
        b.setNextB(null); //next is null, because this is the first
        allBs.save(b);

        //-------------------------------------------
        return mv;
    }
}

Como deve ser meu input no "formCreate.jsp"?

<form name="create" method="POST">
        <label for="b">Name of b:</label><br/>
        <input type="text" name="myName"/>
        <button type="submit" action="/">Submit</button>
</form>

E como eu faria isso com Thymeleaf? E suponha que agora eu tenho um atributo String color em B. E se eu quiser setar o name de n e o color de b no mesmo formulário, como faço para capturar isso no JSP e no Thymeleaf?

Pensei em algo como:

<form name="create" method="POST">
        <label for="b">Name of b:</label><br/>
        <input type="text" value="${n.myName}"/>
        <input type="text" value="${b.color}"/>
        <button type="submit" action="/">Submit</button>
</form>

Mas retorna erro de que o elemento não pode ser nulo. É urgente. Poderiam me ajudar?

4 respostas

Douglas aparentemente o erro está ocorrendo nas suas entidades, nelas você informa através da annotation que os nomes não podem ser nulos, você conseguiu depurar se a informação está chegando nos objetos ?

Sim. Consegui. Não chega. Tentei fazer da seguinte forma agora e continua com o erro. Agora ambos dados são persistidos, todavia são persistidos no mesmo objeto. Suponha que eu coloquei:

Nome: Joaquim
Cor: preta

Quando, no DB faço:

SELECT * FROM A;
Retorno:
1 | Joaquim, preta

Quando faço :

SELECT * FROM A;
Retorno:
 null | null

    <form method="post" action="">
        <lablel>B Name:</lablel>
        <br />
        <spring:bind path="n.myName">
            <input type="text" name="${status.expression}" value="${status.value}">
            <br />
        </spring:bind>
        <label>Color:</label><br />
        <spring:bind path="b.color">
            <input type="text" name="${status.expression}" value="${status.value}">
            <br />
        </spring:bind>
        <input type="submit" value="Create" />
    </form>
solução!

Consegui resolver. Criei uma classe FormBRegister.

public class FormBRegister{
   String name;
   String color;
}

E, no form:

<form method="post">
   <input name="name" type="text" />
   <input name="color" type="text"/>
</form>

Aí eu seto os valores de B e Name com form.getName() e form.getColor()!

Show !! Depois então você fez um tradutor do seu objeto para sua entidade ? Que bom que você conseguiu resolver.