Olá! Neste projeto uso Hibernate, Netbeans 7.0, SQL Server 2008.
Tenho duas classes:
Obra:
package Dominio;
import Dominio.Exemplar;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
@Entity
@Inheritance(strategy= InheritanceType.JOINED)
@Table(name = "Obra", catalog = "DBTestes", schema = "dbo")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Obra.findAll", query = "SELECT o FROM Obra o"),
@NamedQuery(name = "Obra.findByCodObra", query = "SELECT o FROM Obra o WHERE o.codObra = :codObra"),
@NamedQuery(name = "Obra.findByTitulo", query = "SELECT o FROM Obra o WHERE o.titulo = :titulo")})
public class Obra implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name = "CodObra", nullable = false)
private Integer codObra;
@Column(name = "Titulo", length = 30)
private String titulo;
@Basic(optional = false)
@Column(name = "NuExemplar", nullable = false)
private int nuExemplar;
//O FetchType.LAZY significa que o conteúdo da super classe será trazido apenas na primeira solicitação.
@ManyToMany(fetch= FetchType.LAZY)
@JoinTable(name="ObraAutor", joinColumns={@JoinColumn(name="CodObra")},
inverseJoinColumns={@JoinColumn(name="CodAutor")})
//O Annotation Cascade mostra uma opção de executar todos os comandos nas classes relacionadas.
@Cascade(CascadeType.ALL)
private Collection <Autor> autor = new ArrayList<Autor>();
@OneToMany(mappedBy = "codObra", fetch= FetchType.LAZY)
@Cascade(CascadeType.SAVE_UPDATE)
private Collection<Exemplar> exemplar = new ArrayList<Exemplar>();
public Obra() {
}
public Obra(Integer codObra) {
this.codObra = codObra;
}
public Integer getCodObra() {
return codObra;
}
public void setCodObra(Integer codObra) {
this.codObra = codObra;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public int getNuExemplar() {
return nuExemplar;
}
public void setNuExemplar(int nuExemplar) {
this.nuExemplar = nuExemplar;
}
@XmlTransient
public Collection<Autor> getAutor() {
return autor;
}
public void setAutorCollection(Collection<Autor> autor) {
this.autor = autor;
}
@XmlTransient
public Collection<Exemplar> getExemplar() {
return exemplar;
}
public void setExemplar(Collection<Exemplar> exemplar) {
this.exemplar = exemplar;
}
@Override
public int hashCode() {
int hash = 0;
hash += (codObra != null ? codObra.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Obra)) {
return false;
}
Obra other = (Obra) object;
if ((this.codObra == null && other.codObra != null) || (this.codObra != null && !this.codObra.equals(other.codObra))) {
return false;
}
return true;
}
@Override
public String toString() {
return "Dominio.Obra[ codObra=" + codObra + " ]";
}
}
Livro (Que tem herança de Obra):
package Dominio;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
@Entity
@PrimaryKeyJoinColumn(name="CodObra")
@Table(name = "Livro", catalog = "DBTestes", schema = "dbo")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Livro.findAll", query = "SELECT l FROM Livro l"),
@NamedQuery(name = "Livro.findByIsbn", query = "SELECT l FROM Livro l WHERE l.isbn = :isbn"),
@NamedQuery(name = "Livro.findByCodObra", query = "SELECT l FROM Livro l WHERE l.codObra = :codObra")})
public class Livro extends Obra implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "ISBN")
private Integer isbn;
public Livro() {
}
public Integer getIsbn() {
return isbn;
}
public void setIsbn(Integer isbn) {
this.isbn = isbn;
}
@Override
public String toString() {
return "Teste.Livro[ codObra=" + getCodObra() + " ]";
}
}
Exemplar:
package Dominio;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
@Entity
@Table(name = "Exemplar", catalog = "DBTestes", schema = "dbo")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Exemplar.findAll", query = "SELECT e FROM Exemplar e"),
@NamedQuery(name = "Exemplar.findByCodExemplar", query = "SELECT e FROM Exemplar e WHERE e.codExemplar = :codExemplar"),
@NamedQuery(name = "Exemplar.findByInConsulta", query = "SELECT e FROM Exemplar e WHERE e.inConsulta = :inConsulta"),
@NamedQuery(name = "Exemplar.findByInEmprestimo", query = "SELECT e FROM Exemplar e WHERE e.inEmprestimo = :inEmprestimo")})
public class Exemplar implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "CodExemplar", nullable = false)
private Integer codExemplar;
@Column(name = "InConsulta")
private Short inConsulta;
@Basic(optional = false)
@Column(name = "InEmprestimo", nullable = false)
private short inEmprestimo;
@ManyToOne
@JoinColumn(name = "CodObra", referencedColumnName = "CodObra")
private Obra codObra;
@ManyToOne
@JoinColumn(name = "CodEmprestimo", referencedColumnName = "CodEmprestimo")
private Emprestimo codEmprestimo;
public Exemplar() {
}
public Exemplar(Integer codExemplar) {
this.codExemplar = codExemplar;
}
public Integer getCodExemplar() {
return codExemplar;
}
public void setCodExemplar(Integer codExemplar) {
this.codExemplar = codExemplar;
}
public Short getInConsulta() {
return inConsulta;
}
public void setInConsulta(Short inConsulta) {
this.inConsulta = inConsulta;
}
public short getInEmprestimo() {
return inEmprestimo;
}
public void setInEmprestimo(short inEmprestimo) {
this.inEmprestimo = inEmprestimo;
}
public Obra getCodObra() {
return codObra;
}
public void setCodObra(Obra codObra) {
this.codObra = codObra;
}
public Emprestimo getCodEmprestimo() {
return codEmprestimo;
}
public void setCodEmprestimo(Emprestimo codEmprestimo) {
this.codEmprestimo = codEmprestimo;
}
@Override
public int hashCode() {
int hash = 0;
hash += (codExemplar != null ? codExemplar.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Exemplar)) {
return false;
}
Exemplar other = (Exemplar) object;
if ((this.codExemplar == null && other.codExemplar != null) || (this.codExemplar != null && !this.codExemplar.equals(other.codExemplar))) {
return false;
}
return true;
}
@Override
public String toString() {
return "Dominio.Exemplar[ codExemplar=" + codExemplar + " ]";
}
}
Como faço para cadastrar ao mesmo tempo atributos de livro e exemplar?
Ou seja, no caso, eu preciso cadastrar uma obra que tem muitos exemplares, então esses exemplares receberão os mesmo atributos da obra que estou cadastrando. Então como faço isso?
Alguém tem uma ideia de código? Será que vou precisar usar o Iterator, ou este só pode ser usado pra buscar um Collection já existente no banco?
Ajuda, por favor!!