如果我尝试在我的系统中注册新用户,我将收到例外
@Entity
@Table(name = "usuario")
public class Usuario implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Column(name = "nome")
private String nome;
@Column(name = "email")
private String email;
@Column(name = "senha")
private String senha;
@JoinColumn(name = "estado_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Estado estadoId;
@JoinColumn(name = "tipo_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Tipo tipoId;
TIPO
@Entity
@Table(name = "tipo")
public class Tipo implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Column(name = "nome")
private String nome;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "tipoId")
private List<Usuario> usuarioList;</code>
埃斯塔
@Entity
@Table(name = "estado")
public class Estado implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Column(name = "nome")
private String nome;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "estadoId")
private List<Usuario> usuarioList;
DAO
@Repository
public class UsuarioDaoImpl implements UsuarioDAO {
@Autowired
private SessionFactory session;
@Override
public void add(Usuario usuario) {
session.getCurrentSession().save(usuario);
}
服务春天
@Service
public class UsuarioServiceImpl implements UsuarioService {
@Autowired
private UsuarioDAO usuarioDao;
@Transactional
public void add(Usuario usuario) {
usuarioDao.add(usuario);
}
UsuarioController
@Controller
public class UsuarioController {
@Autowired
private UsuarioService usuarioService;
@RequestMapping("/usuario")
public String setupForm(Map<String, Object> map) {
Usuario usuario = new Usuario();
map.put("usuario", usuario);
map.put("usuarioList", usuarioService.getAllUsuario());
return "usuario";
}
@RequestMapping(value = "/usuario.do", method = RequestMethod.POST)
public String doActions(@ModelAttribute Usuario usuario,
BindingResult result, @RequestParam String action,
Map<String, Object> map) {
Usuario usuarioResult = new Usuario();
switch (action.toLowerCase()) {
case "cadastrar":
usuarioService.add(usuario);
usuarioResult = usuario;
break;
case "alterar":
usuarioService.edit(usuario);
usuarioResult = usuario;
break;
case "excluir":
usuarioService.delete(usuario.getId());
usuarioResult = new Usuario();
break;
case "pesquisar":
Usuario searchedUsuario = usuarioService
.getUsuario(usuario.getId());
usuarioResult = searchedUsuario != null ? searchedUsuario
: new Usuario();
break;
}
map.put("usuario", usuarioResult);
map.put("usuarioList", usuarioService.getAllUsuario());
return "usuario";
}
}
页
<form:form action="usuario.do" method="POST" commandName="usuario">
<table>
<tr>
<td>Nome</td>
<td><form:input path="nome"/></td>
</tr>
<tr>
<td>Email</td>
<td><form:input path="email"/></td>
</tr>
<tr>
<td>Senha</td>
<td><form:input path="senha"/></td>
</tr>
<tr>
<td>Tipo</td>
<td><form:input path="tipoId"/></td>
</tr>
<tr>
<td>Estado</td>
<td><form:input path="estadoId"/></td>
</tr>
<tr>
<td colspan="2">
<input type = "submit" name="action" value="Cadastrar" />
<input type = "submit" name="action" value="Alterar" />
<input type = "submit" name="action" value="Excluir" />
<input type = "submit" name="action" value="Pesquisar" />
</tr>
</table>
</form:form>
项目列表很好,但如果我尝试注册新用户
not-null属性引用null或transient值:com.klisman.model.Usuario.estadoId`
感谢您的关注
答案 0 :(得分:1)
由于您未向Estado
对象设置Usuario
对象,因此导致您的问题。因为您要加入Estado
对象的ID并建立所需的关系(使用@ManyToOne(optional=false)
注释),Hibernate拒绝保存您的Usuario
对象,因为{{1它缺少对象。
在您的服务层中,您需要执行类似以下操作:
Estado
上述情况应该会成功,假设您传入了正确的@Transactional
public void add(Usuario usuario, Estado estado, Tipo tipo) {
usuario.setEstado(estado);
usuario.setTipo(tipo);
usuarioDao.add(usuario);
}
和Estado
个对象。这假设您的Tipo
和Estado
对象已存在于数据库,以及您使用他们的ID获取它们,但是如果他们不需要反转级联的方向,以便在保存Tipo
对象时通过级联创建它们。
编辑1: 我不打算给你一个完整的例子,但我的意思是这样做:
Usuario
然后使用您的其他服务获取需要保存在@Controller
public class Controller {
@Autowired
private EstadoService estadoService;
@Autowired
private TipoService tipoService;
@Autowired
private UsuarioService usuarioService;
对象上的Estado
和Tipo
个对象,将其添加到该对象,然后保存Usuario
对象
答案 1 :(得分:0)
感谢您的帮助,但是控制器有多个类?
@RequestMapping(value="/usuario.do", method=RequestMethod.POST)
public String doActions(@ModelAttribute Usuario usuario, BindingResult result, @RequestParam String action, Map<String, Object> map){
Usuario usuarioResult = new Usuario();
switch(action.toLowerCase()){
case "cadastrar":
usuarioService.add(usuario);
usuarioResult = usuario;
break;