Amigos, tengo 1 semana intentando comprender las Anotaciones EJB3 de las Entity Class para tener relacionadas las tablas de mi BD.
Este EJB parece muy fabuloso pero me parece muy dificil el como usarlo...
Estoy usando
- NetBeans 6.1
- TopLink Essential
- Mysql 5.x (Motor de almacenamiento MyIsam)
Ejemplo:
Primera Tabla:
Código PHP:
CREATE TABLE `table1` (
`ID` int(11) NOT NULL auto_increment,
`NOMBRE` varchar(20) default NULL,
PRIMARY KEY (`ID`),
)
// SEGUNDA TABLA
CREATE TABLE `table2` (
`ID` int(11) NOT NULL auto_increment,
`NOMBRE` int(11) default NULL,
`APELLIDO` varchar(255) default NULL,
PRIMARY KEY (`ID`),
)
Hasta ahora en algunos codigos de ejemplo, se que se puede extraer desde la Entidad
table1, todos los registros de la Entidad
table2 con Anotaciones
@OneToMany .... @ManyToOne Código PHP:
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
/**
*
* @author Administrador
*/
@Entity
@Table(name = "table1")
@NamedQueries({@NamedQuery(name = "Table1.findById", query = "SELECT t FROM Table1 t WHERE t.id = :id"), @NamedQuery(name = "Table1.findByNombre", query = "SELECT t FROM Table1 t WHERE t.nombre = :nombre")})
public class Table1 implements Serializable {
@Transient
private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID", nullable = false)
private Integer id;
@Column(name = "NOMBRE")
private String nombre;
@OneToMany(mappedBy="NOMBRE")
private Collection<Table2> table2;
public Table1() {
}
public Table1(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
Integer oldId = this.id;
this.id = id;
changeSupport.firePropertyChange("id", oldId, id);
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
String oldNombre = this.nombre;
this.nombre = nombre;
changeSupport.firePropertyChange("nombre", oldNombre, nombre);
}
public Collection<Table2> getTable2() {
return table2;
}
public void setTable2(Collection<Table2> table2) {
this.table2 = table2;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.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 Table1)) {
return false;
}
Table1 other = (Table1) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "com.dkcontrol.presupuesto.Table1[id=" + id + "]";
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
changeSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
changeSupport.addPropertyChangeListener(listener);
}
}
Código PHP:
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
/**
*
* @author Administrador
*/
@Entity
@Table(name = "table2")
@NamedQueries({@NamedQuery(name = "Table2.findById", query = "SELECT t FROM Table2 t WHERE t.id = :id"), @NamedQuery(name = "Table2.findByNombre", query = "SELECT t FROM Table2 t WHERE t.nombre = :nombre"), @NamedQuery(name = "Table2.findByApellido", query = "SELECT t FROM Table2 t WHERE t.apellido = :apellido")})
public class Table2 implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID", nullable = false)
private Integer id;
@ManyToOne
@JoinColumn(name = "ID", referencedColumnName = "NOMBRE", insertable = false, updatable = false)
@Column(name = "NOMBRE")
private Integer nombre;
@Column(name = "APELLIDO")
private String apellido;
public Table2() {
}
public Table2(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getNombre() {
return nombre;
}
public void setNombre(Integer nombre) {
this.nombre = nombre;
}
public String getApellido() {
return apellido;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.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 Table2)) {
return false;
}
Table2 other = (Table2) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "com.dkcontrol.presupuesto.Table2[id=" + id + "]";
}
}
La relacion entre mis 2 tablas es el campo NOMBRE... pero no logro extraer todos los registros de
table2 desde
table1
He Copiado varios codigos de ejemplos, pero al ejecutarlos siempre me da algun error, como la definicion errónea del
mappedBy,
@JoinColumn, en fin lo unico que he podido crear y entender, es una relacion de @OneToOne...
Si alguien tienen algun tutorial bueno en Español, se lo agradeceria mucho el link ó explicarme el funcionamiento de las anotaciones para crear las relaciones entre tablas. Ya hasta lei parte de las Especificafiones del EJB3 de sun pero nada, no logro la BENDITA relación...
PD: sería excelente que netbeans tuviera un asistente para crear las relaciones de las tablas sin tener que usar el
motor InnoDB para crearlas...
Gracias...