Dans mon projet de printemps en cours, mes formes sont à mettre en œuvre une structure comme celle-ci:erreur lorsqu'un formulaire avec un champ de sélection est soumis
<form class="form" id="Pagina" role="form" method="POST" action="/loja/Pagina/cadastra" enctype="multipart/form-data">
...
</form>
et il est traité dans le serveur par ce methos:
contrôleur
@RequestMapping(value="cadastra", method=RequestMethod.POST)
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public E cadastra(@ModelAttribute("object") E object, BindingResult result, @RequestParam(value="file", required=false) MultipartFile file, @RequestParam(value="icone", required=false) MultipartFile icone, @RequestParam(value="screenshot", required=false) MultipartFile screenshot[]) throws Exception {
E ret = serv.cadastra(object, file, icone, screenshot);
if (ret != null)
return ret;
else
throw new Exception();
}
Service
regarde à l'intérieur comme@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name="pagina_mae", nullable = true)
@Order(value=5)
@Select(name="pagina", ordem = 5)
@Sidebar
private Pagina pagina;
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name="produto_mae", nullable = true)
@Order(value=6)
@Select(name="produto", ordem = 6)
@Sidebar
private Produto produto;
Si les options ceci:
@PreAuthorize("hasPermission(#user, 'cadastra_'+#this.this.name)")
@Transactional
public E cadastra(E e, MultipartFile file, MultipartFile icone, MultipartFile[] screenshot) {
return dao.persist(e);
}
Mon problème, il est quand la forme ont un champ comme celui-ci:
<label>pagina</label>
<select name="pagina.id" class="form-control select" data-lista="/loja/Pagina/listagem.json">
...
</select>
<label>produto</label>
<select name="produto.id" class="form-control select" data-lista="/loja/Produto/listagem.json">
...
</select>
qui associe un atribute comme celui-ci dans la classe entiy :
<option value="">.</option>
<option value="...">...</option>
Si je soumets le formulaire avec l'option vide sélectionnée, Je reçois cette erreur:
object references an unsaved transient instance - save the transient instance before flushing: com.spring.loja.model.pagina.persistence.model.Pagina; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.spring.loja.model.pagina.persistence.model.Pagina
mais si, par exemple, insérer un enregistrement manuellement dans la base de données (dans mon cas, en utilisant pgAdmin3) et sélectionnez cet élément dans la sélection, le formulaire est soumis sans erreurs. Tout le monde peut me dire comment je corrige cela, pour me permettre de soumettre le formulaire avec ou sans les données sélectionnées de <select>
.
UPDATE
Codepour la classe Pagina
:
@Entity
@Table(name="pagina")
@MainForm(grupo = 2, icone = "file")
public class Pagina extends ModelEntity {
@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Column(name = "nome", unique = true)
@Order(value=1)
@Input(type="hidden", name="nome", ordem = 1)
private String nome;
@Column(name = "titulo", nullable = false)
@Order(value=2)
@Input(name="titulo", ordem = 2)
private String titulo;
@Column(name = "descricao", length=65535)
@Order(value=4)
@Textarea(name="descricao", ordem = 4)
private String descricao;
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name="pagina_mae", nullable = true)
@Order(value=5)
@Select(name="pagina", ordem = 5)
@Sidebar
private Pagina pagina;
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name="produto_mae", nullable = true)
@Order(value=6)
@Select(name="produto", ordem = 6)
@Sidebar
private Produto produto;
}
UPDATE 2
PaginaEditor.java
@Component
public class PaginaEditor extends PropertyEditorSupport {
@Inject
private PaginaService paginaService;
@Override
public void setAsText(String text) {
if (!text.isEmpty()) {
Pagina pagina = paginaService.getObject(text);
setValue(pagina);
}
}
}
procédé ajouté à mon contrôleur:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Pagina.class, new PaginaEditor());
}
c'est un problème ORM. Devinez Hibernate? Si vous ajoutez une étiquette pour l'ORM que vous utilisez, vous aurez beaucoup plus de chances de trouver de l'aide. Consultez également cette question/awnser http://stackoverflow.com/questions/2302802/object-references-an-unsaved-transient-instance-save-the-transient-instance-be –
pouvez-vous s'il vous plaît nous montrer le code pour dao. persister (e); comment persistez-vous exactement, comme je pense peut-être que je sais ce que le problème est ici. – Aeseir
@ug_ J'ai vu le lien, mais si j'essaie de suivre la suggestion (basiquement, c'est l'option 'cascade'), l'application essaie d'insérer un nouveau Pagina ou Produto et de l'associer à la Pagina que j'insère. –