Spring Hibernate not-null属性引用null或transient值:com.klisman.model.Usuario.estadoId

时间:2014-05-29 19:59:22

标签: java spring hibernate jpa

如果我尝试在我的系统中注册新用户,我将收到例外

@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`

感谢您的关注

2 个答案:

答案 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个对象。这假设您的TipoEstado对象已存在于数据库,以及您使用他们的ID获取它们,但是如果他们不需要反转级联的方向,以便在保存Tipo对象时通过级联创建它们。

编辑1: 我不打算给你一个完整的例子,但我的意思是这样做:

Usuario

然后使用您的其他服务获取需要保存在@Controller public class Controller { @Autowired private EstadoService estadoService; @Autowired private TipoService tipoService; @Autowired private UsuarioService usuarioService; 对象上的EstadoTipo个对象,将其添加到该对象,然后保存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;