2012-09-18 18 views
7

No puedo entender cuál es el problema, por favor ayuda. He buscado mucho, pero no encontré ningún consejo útil. Quizás podrías ayudarme. Muchas gracias.La entidad objetivo del atributo de relación no se puede determinar

Hay dos clases usando EclipseLink como proveedor JPA:

@Entity 
@Table(name = "USER") 
public class User { 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    private Long id; 

    private String login; 

    private Long groupId; 

    private String email; 

    @ManyToMany(mappedBy = "users") 
    private List polls; 

    @OneToMany(mappedBy = "user") 
    private List votes; 

    public List getVotes() { 
     return votes; 
    } 

    public void setVotes(List votes) { 
     this.votes = votes; 
    } 

    public User() { 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getLogin() { 
     return login; 
    } 

    public void setLogin(String login) { 
     this.login = login; 
    } 

    public Long getGroupId() { 
     return groupId; 
    } 

    public void setGroupId(Long groupId) { 
     this.groupId = groupId; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public List getPolls() { 
     return polls; 
    } 

    public void setPolls(List polls) { 
     this.polls = polls; 
    } 
} 

y

@Entity 
@Table(name = "VOTE") 
public class Vote { 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    private Long vid; 

    private String comment; 

    @ManyToOne 
    private User user; 

    @ManyToOne 
    private Option option; 

    public Vote() { 
    } 

    public Long getVid() { 
     return vid; 
    } 

    public void setVid(Long vid) { 
     this.vid = vid; 
    } 

    @Column(name = "comment") 
    public String getComment() { 
     return comment; 
    } 

    public void setComment(String comment) { 
     this.comment = comment; 
    } 

    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    public Option getOption() { 
     return option; 
    } 

    public void setOption(Option option) { 
     this.option = option; 
    } 

} 

Cuando estoy tratando de compilar este, recibo de error:

Exception [EclipseLink-7214] (Eclipse Persistence Services - 2.4.0.v20120608-r11652): org.eclipse.persistence.exceptions.ValidationException 
Exception Description: The target entity of the relationship attribute [votes] on the class [class logic.User] cannot be determined. When not using generics, ensure the target entity is defined on the relationship mapping. 

Aquí es mi archivo persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="pollsPU" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>   
     <class>logic.Option</class> 
     <class>logic.Poll</class> 
     <class>logic.User</class> 
     <class>logic.Vote</class>  
     <class>logic.Greeting</class>  
     <properties> 
      <property name="eclipselink.jdbc.password" value="" /> 
      <property name="eclipselink.jdbc.user" value="" /> 
      <property name="eclipselink.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
      <property name="eclipselink.jdbc.url" 
       value="jdbc:mysql://localhost:3306/core_polls" /> 
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> 
      <property name="eclipselink.logging.level" value="INFO" /> 
      <property name="eclipselink.ddl-generation.output-mode" 
       value="database" /> 
     </properties> 
    </persistence-unit> 
</persistence> 
+0

Esto también puede ocurrir (no en su caso, pero es útil para las personas que llegan aquí desde un motor de búsqueda) si se ha confundido de uno a varios con uno a muchos. –

Respuesta

12

Como se indica en la Javadoc

If the collection is defined using generics to specify the element type, the associated target entity type need not be specified; otherwise the target entity class must be specified.

Por lo tanto, puede realizar una

@OneToMany(mappedBy = "user") 
private List<Vote> votes; 

o

@OneToMany(targetEntity=logic.Vote.class, mappedBy = "user") 
private List votes; 

pero prefiero la primera.

Cuestiones relacionadas