2012-09-18 13 views
7

Nie mogę ustalić, na czym polega problem, proszę o pomoc. Wiele szukałem, ale nie znalazłem żadnej przydatnej porady. Może ty możesz mi pomóc. Wielkie dzięki.Nie można określić jednostki docelowej atrybutu relacji

Istnieją dwie klasy wykorzystujące EclipseLink jako dostawcy 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; 
    } 
} 

i

@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; 
    } 

} 

Kiedy próbuję skompilować ten, otrzymuję błąd:

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. 

Tutaj jest mój plik 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

Może się to również zdarzyć (nie w twoim przypadku, ale jest to przydatne dla osób przybywających tutaj z wyszukiwarki), jeśli wiele osób zostało pomylonych z jeden-do-wielu. –

Odpowiedz

12

Jak stwierdzono w 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.

Tak, można zrobić albo

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

lub

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

Ale wolałbym pierwszy.