JPA persist tabela pai e filhas sem tabela pai criada

Aew Gaelra pelo assunto vai ficar dificil entender mas é complicado explicar :slight_smile:

tenho uma aplicação que estou desenvolvendo para estudar um pouco JPA + Hibernate e estou tendo problema na hora de inserir uma tabela pai com varias tabelas relacionadas, por exemplo tabela Escola relacionada com Série, eu fiz uma view quando eu vou cadastrar uma escola eu add todas as serie daquela escola, populo o objeto Escola(ainda nao existente no banco de dados) seto a lista de series no objeto, e na hora de dar um persist no objeto Escola me da um erro de relacionamento pois nao existe o idEscola.

A duvida, o JPA nao deveria inserir primeiro a tabela pai Escola e depois inserir os relacionamentos (os objetos Serie relacionados) ?

como eu resolvo, é alguma configuração no JPA ou eu preciso primeiro dar um persist no objeto Escola vazio e depois adicionar a lista de Series e dar outro persist?

Obrigado.

[quote=furacao123]Aew Gaelra pelo assunto vai ficar dificil entender mas é complicado explicar :slight_smile:

tenho uma aplicação que estou desenvolvendo para estudar um pouco JPA + Hibernate e estou tendo problema na hora de inserir uma tabela pai com varias tabelas relacionadas, por exemplo tabela Escola relacionada com Série, eu fiz uma view quando eu vou cadastrar uma escola eu add todas as serie daquela escola, populo o objeto Escola(ainda nao existente no banco de dados) seto a lista de series no objeto, e na hora de dar um persist no objeto Escola me da um erro de relacionamento pois nao existe o idEscola.

A duvida, o JPA nao deveria inserir primeiro a tabela pai Escola e depois inserir os relacionamentos (os objetos Serie relacionados) ?

como eu resolvo, é alguma configuração no JPA ou eu preciso primeiro dar um persist no objeto Escola vazio e depois adicionar a lista de Series e dar outro persist?

Obrigado.[/quote]

sem ver a mensagem de erro ou seu mapeamento fica dificil… mas vamos tentar.
vamos fazer um jeito mais fácil: primeiro insiria a escola em seguida insira todas séries daquela escola… com um insert para cada série. portanto sem essa de jogar uma lista pra inserir tudo q tiver lá.
para isso, vc tem q criar um objeto escola e outro série. a referencia para escola estará nesses objeto série.
quanto vc for trazer do banco as séries, já vai ter a escola referenciada nelas. mas tb é possível ter uma lista com todas as séries no objeto escola, mas nesse momento isos só vai atrapalhar seu aprendizado… por falar nisso essa funcionalidade se chama relacionamento bidirecional.

e não aguento mais repetir isso :smiley: quando quiser aprender hibernate de verdade leia essa apostila:

bem mais fácil q come;ar do zero sozinho :wink:

Ok eu ja entendo das anotações e relacionamentos do JPA - Hibernate mas vou dar uma lida nessa apostila
segue as classes com seus respectivos relacionamentos

public class Escola implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id", nullable = false) private Integer id; @Basic(optional = false) @Column(name = "descricao", nullable = false, length = 80) private String descricao; @Basic(optional = false) @Column(name = "ativo", nullable = false) private short ativo; @ManyToMany(mappedBy = "escolaSet", fetch = FetchType.LAZY) private Set<Telefone> telefoneSet; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idEscola", fetch = FetchType.LAZY) private Set<EscolaSerie> escolaSerieSet;
EscolaSerie

public class EscolaSerie implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id", nullable = false) private Integer id; @Column(name = "requerProfSerie") private Short requerProfSerie; @JoinColumn(name = "idPeriodo", referencedColumnName = "id", nullable = false) @ManyToOne(optional = false, fetch = FetchType.LAZY) private PeriodoSerie idPeriodo; @JoinColumn(name = "idComplemento", referencedColumnName = "id", nullable = false) @ManyToOne(optional = false, fetch = FetchType.LAZY) private ComplementoSerie idComplemento; @JoinColumn(name = "idEscola", referencedColumnName = "id", nullable = false) @ManyToOne(optional = false, fetch = FetchType.LAZY) private Escola idEscola; @JoinColumn(name = "idSerie", referencedColumnName = "id", nullable = false) @ManyToOne(optional = false, fetch = FetchType.LAZY) private Serie idSerie; @JoinColumn(name = "idProfessor", referencedColumnName = "id", nullable = false) @ManyToOne(optional = false, fetch = FetchType.LAZY) private Professor idProfessor; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idEscolaSerie", fetch = FetchType.LAZY) private Set<Aluno> alunoSet;
Serie

public class Serie implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id", nullable = false) private Integer id; @Basic(optional = false) @Column(name = "descricao", nullable = false, length = 80) private String descricao; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idSerie", fetch = FetchType.LAZY) private Set<EscolaSerie> escolaSerieSet; @OneToMany(cascade = CascadeType.ALL, mappedBy = "serie", fetch = FetchType.LAZY) private Set<Professor> professorSet;
Professor

public class Professor implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id", nullable = false) private Integer id; @Column(name = "nome", length = 80) private String nome; @Basic(optional = false) @Column(name = "ativo", nullable = false) private boolean ativo; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idProfessor", fetch = FetchType.LAZY) private Set<EscolaSerie> escolaSerieSet; @JoinColumn(name = "idSerie", referencedColumnName = "id", nullable = false) @ManyToOne(optional = false, fetch = FetchType.LAZY) private Serie serie;
A duvida esta o JPA deveria salvar primeiro a tabela pai e depois inserir as filhas, pois em uma view eu crio uma lista de escolasserie e adiciono no objeto escola ainda nao registrado no BD e dou um persist no objeto escola ae o erro esta que o idEscola do objeto EscolaSerie esta null

[b]Galera, tive um problema muito parecido com isso…
e a solução foi o seguinte:

Testa colocar o seguinte método na classe Pai:

@PrePersist
public void fillMappedByReferences() {
if ( this.listaDeFilhos != null) {
for (Filho filho: this.listaDeFilhos) {
filho.setPai(this);
}
}
}[/b]