Ver Mensaje Individual
  #1 (permalink)  
Antiguo 11/01/2009, 11:20
Maco_
 
Fecha de Ingreso: enero-2009
Mensajes: 1
Antigüedad: 16 años, 2 meses
Puntos: 0
Pregunta Problema con JPA y claves externas multiatributo

Hola, estoy utilizando NetBeans para generar automáticamente "Entity Classes from Database...". En general me genera perfectamente las clases pero tengo una tabla que tiene como clave foranea tres atributos. Algo tal que así:

Código:
ALTER TABLE Capital ADD FOREIGN KEY (`Jugador`, `Ciudad`, `Turno`) REFERENCES
`Propietario` (`Jugador`, `Ciudad`, `Turno`) ON UPDATE CASCADE;
Me genera perfectamente la clase Capital (con su CapitalPK incluida). El problema es que a la hora de ejecutar, cuando intenta crear el EntityManager el programa lanza una excepción y la descripción que da de ella es la siguiente:

Código:
Exception Description: The @JoinColumns on the annotated element
[private modelo.Propietario modelo.Capital.propietario] from the entity class
[class modelo.Capital] is incomplete. When the source entity class uses a
composite primary key, a @JoinColumn must be specified for each join column
using the @JoinColumns. Both the name and the referenceColumnName elements
must be specified in each such @JoinColumn.
Mis clases Capital y Propietario son las siguientes:

Código:
@Entity
@Table(name = "Capital")
@NamedQueries({@NamedQuery(name = "Capital.findAll", query = "SELECT c FROM Capital c"), @NamedQuery(name = "Capital.findByJugador", query = "SELECT c FROM Capital c WHERE c.capitalPK.jugador = :jugador"), @NamedQuery(name = "Capital.findByTurno", query = "SELECT c FROM Capital c WHERE c.capitalPK.turno = :turno")})
public class Capital implements Serializable {

    private static final long serialVersionUID = 1L;
    @EmbeddedId
    protected CapitalPK capitalPK;
    @JoinColumns({@JoinColumn(name = "Jugador", referencedColumnName = "Jugador", insertable = false, updatable = false), @JoinColumn(name = "Ciudad", referencedColumnName = "Ciudad"), @JoinColumn(name = "Turno", referencedColumnName = "Turno", insertable = false, updatable = false)})
    @ManyToOne(optional = false)
    private Propietario propietario;
}
Código:
@Entity
@Table(name = "Propietario")
@NamedQueries({@NamedQuery(name = "Propietario.findAll", query = "SELECT p FROM Propietario p"), @NamedQuery(name = "Propietario.findByCiudad", query = "SELECT p FROM Propietario p WHERE p.propietarioPK.ciudad = :ciudad"), @NamedQuery(name = "Propietario.findByTurno", query = "SELECT p FROM Propietario p WHERE p.propietarioPK.turno = :turno")})
public class Propietario implements Serializable {

    private static final long serialVersionUID = 1L;
    @EmbeddedId
    protected PropietarioPK propietarioPK;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "propietario")
    private Collection<Capital> capitalCollection;
    @JoinColumn(name = "Jugador", referencedColumnName = "Nick")
    @ManyToOne(optional = false)
    private Jugadores jugador;
    @JoinColumn(name = "Ciudad", referencedColumnName = "Nombre", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Ciudades ciudades;
    @JoinColumn(name = "Turno", referencedColumnName = "Turno", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Turnos turnos;
}
¿Alguien detecta el error? La verdad no estoy muy experimentado en los Beans...