Bom dia , sou iniciante no hibernate e me deparei com a seguinte duvida.
Estou usando o padrão , ou no caso ante-padão , session per operation ( estou abrindo uma sessao toda vez que preciso consultar no banco e fechando antes de trazer os dados para a camada de controle ) e tenho duas entidades , uma delas é um usuario que possui dentro de si uma lista de mensagens outra é a mensagem que possui dentro de si um usuario .Fiz o mapeamento correto ( sei disso por que o tabelas ficaram da maneira como eu imaginei ) , e coloquei o atributo CASCADE como ALL ( fiz isso pois como ja disse sou iniciante e esse parecia se o mais certo ) , mas agora apareceu um problema crio uma mensagem nova eu seto apenas o id do seu atributo usuario ( mensagem.getUsuario().setId(1) ) , e quando ele vai salvar no banco ele simplesmente vai na tabela usuario e coloca todos os atributos do usuario com valor NULL . Eu sei por que isso acontece , é por causa do cascade , li todos os tipos de cascade que tem e ainda assim eu não estou entendendo qual devo usar.Quero que quando o usuario for salvo se ele tiver mensagens que elas seja salvas tambem , e quero que a mensagem quando for não toque na tabela de usuario .Alguem sabe como resolvo meu problema ?
Segue os mapeamentos :
public class Usuario {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="idusuario")
private Integer id;
@Column(unique=true)
private String login;
@Column(nullable=false)
private String senha;
@OneToMany(mappedBy="usuario" , fetch=FetchType.LAZY)
@Cascade(CascadeType.ALL)
List<Mensagem> mensagens;
}
public class Mensagem {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="idmensagem")
private Integer id;
private String conteudo;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="idusuario")
@Cascade(CascadeType.ALL)
private Usuario usuario;
}