Oi, gabrielemidio!
Estas são as classes:
Classe Livro:
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 = "dbTestesRegras", 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() + " ]";
}
}
Classe 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.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 = "dbTestesRegras", 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>();
@ManyToMany
@JoinTable(name = "EmprestimoObra", joinColumns = {
@JoinColumn(name = "CodObra")},
inverseJoinColumns = {
@JoinColumn(name = "CodEmprestimo")})
@Cascade(CascadeType.ALL)
private Collection<Emprestimo> emprestimo;
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<Emprestimo> getEmprestimo() {
return emprestimo;
}
public void setEmprestimo(Collection<Emprestimo> emprestimo) {
this.emprestimo = emprestimo;
}
@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 + " ]";
}
}
Classe Exemplar:
package Dominio;
import java.io.Serializable;
import java.util.Collection;
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.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
@Entity
@Table(name = "Exemplar", catalog = "dbTestesRegras", 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;
@ManyToMany
@JoinTable(name = "EmprestimoObra", joinColumns = {
@JoinColumn(name = "CodEmprestimo", referencedColumnName = "CodExemplar", nullable = false)}, inverseJoinColumns = {
@JoinColumn(name = "CodExemplar", referencedColumnName = "CodEmprestimo", nullable = false)})
private Collection<Emprestimo> emprestimo;
@ManyToOne
@JoinColumn(name = "CodObra", referencedColumnName = "CodObra")
private Obra codObra;
public Exemplar() {
}
public Exemplar(Integer codExemplar) {
this.codExemplar = codExemplar;
}
public Exemplar(Integer codExemplar, short inEmprestimo) {
this.codExemplar = codExemplar;
this.inEmprestimo = inEmprestimo;
}
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;
}
@XmlTransient
public Collection<Emprestimo> getEmprestimo() {
return emprestimo;
}
public void setEmprestimo(Collection<Emprestimo> emprestimo) {
this.emprestimo = emprestimo;
}
public Obra getCodObra() {
return codObra;
}
public void setCodObra(Obra codObra) {
this.codObra = codObra;
}
@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 + " ]";
}
}
Tenho aí uma herança de obra e livro: Livro recebe tudo de Obra.
Também tem aí um relacionamento de um para muitos entre obra e exemplar, ou seja, uma obra possui muitos exemplares.

E como eu poderia fazer a chamada int? Eu não entendi. :shock: