2010-09-14 4 views
1

Привет, У меня есть проблема с приобретением навыков у добровольца. по какой-то причине я не получаю список при использовании этого методаManyToMany JPA fetch

public Volunteer getVolunteer(int id){ 

Volunteer vo; 

Query q; 

q = em.createNamedQuery("Volunteer.findById").setParameter("id", id); 
vo = (Volunteer) q.getSingleResult(); 

for(Skill s: vo.getSkills()){ 
    System.out.println(s); 
} 

return vo; 

} 

список пуст, так что выборка не похоже на работу.

Im использованием JPA EclipseLink и Glassfish

Любая помощь приветствуется!

Умение лицо:

@Entity 
@Table(name="skill") 
@NamedQueries({ 
    @NamedQuery(name = "Skill.findAll", query = "SELECT s FROM Skill s"), 
    @NamedQuery(name = "Skill.findById", query = "SELECT s FROM Skill s WHERE s.id = :id"), 
    @NamedQuery(name = "Skill.findBySkillDescription", query = "SELECT s FROM Skill s WHERE s.skillDescription = :skillDescription")}) 
public class Skill implements Serializable { 
@Override 
public String toString() { 
    return "Skill [id=" + id + ", skillDescription=" + skillDescription 
    + "]"; 
} 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(unique=true, nullable=false) 
private int id; 

@Column(name="skill_description", length=130) 
private String skillDescription; 

//bi-directional many-to-many association to Volunteer 
    @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER) 
@JoinTable(
    name="skill_volunteer" 
    , joinColumns={ 
    @JoinColumn(name="skill_id", nullable=false) 
    } 
    , inverseJoinColumns={ 
    @JoinColumn(name="volunteer_id", nullable=false) 
    } 
) 
private List<Volunteer> volunteers; 

    public Skill() { 
    } 

public int getId() { 
    return this.id; 
} 

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

public String getSkillDescription() { 
    return this.skillDescription; 
} 

public void setSkillDescription(String skillDescription) { 
    this.skillDescription = skillDescription; 
} 

public List<Volunteer> getVolunteers() { 
    return this.volunteers; 
} 

public void setVolunteers(List<Volunteer> volunteers) { 
    this.volunteers = volunteers; 
} 

} 

И доброволец лицо:

@Entity 
@Table(name="volunteer") 
@NamedQueries({ 
    @NamedQuery(name = "Volunteer.findAll", query = "SELECT v FROM Volunteer v"), 
    @NamedQuery(name = "Volunteer.findById", query = "SELECT v FROM Volunteer v WHERE v.id = :id"), 
    @NamedQuery(name = "Volunteer.findByPhone", query = "SELECT v FROM Volunteer v WHERE v.phone = :phone"), 
    @NamedQuery(name = "Volunteer.findByEmail", query = "SELECT v FROM Volunteer v WHERE v.email = :email"), 
    @NamedQuery(name = "Volunteer.findByFirstName", query = "SELECT v FROM Volunteer v WHERE v.firstName = :firstName"), 
    @NamedQuery(name = "Volunteer.findByLastName", query = "SELECT v FROM Volunteer v WHERE v.lastName = :lastName")}) 
public class Volunteer implements Serializable { 
@Override 
public String toString() { 
    return "Volunteer [id=" + id + ", email=" + email + ", firstName=" 
    + firstName + ", lastName=" + lastName + ", phone=" + phone 
    + "]"; 
} 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(unique=true, nullable=false) 
private int id; 

@Column(length=255) 
private String email; 

@Column(name="first_name", length=255) 
private String firstName; 

@Column(name="last_name", length=255) 
private String lastName; 

@Column(length=255) 
private String phone; 

//bi-directional many-to-many association to Event 
@ManyToMany(mappedBy="volunteers") 
private List<Event> events; 

//bi-directional many-to-many association to Skill 
@ManyToMany(mappedBy="volunteers", cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
private List<Skill> skills; 

    public Volunteer() { 
    } 

public int getId() { 
    return this.id; 
} 

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

public String getEmail() { 
    return this.email; 
} 

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

public String getFirstName() { 
    return this.firstName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

public String getLastName() { 
    return this.lastName; 
} 

public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 

public String getPhone() { 
    return this.phone; 
} 

public void setPhone(String phone) { 
    this.phone = phone; 
} 

public List<Event> getEvents() { 
    return this.events; 
} 

public void setEvents(List<Event> events) { 
    this.events = events; 
} 

public List<Skill> getSkills() { 
    return this.skills; 
} 

public void setSkills(List<Skill> skills) { 
    this.skills = skills; 
} 

} 

ответ

0

список пуст, так что выборка не похоже на работу.

Получение пустой список не позволяет сделать вывод о том, что «выборка» не работает, и вы используете LAZY или нетерпеливый тип выборки, вы должны получить навыки записи для данного волонтера, если таковые имеются ли.

И потому, что отображение выглядит правильно, я хотел бы начать, посмотрев на сгенерированный SQL и запустить его с базой данных, чтобы подтвердить

  1. , что сгенерированный SQL является ожидаемый результат
  2. , что данные являются правильными ,

Для этого установите следующие свойства в persistence.xml:

<property name="eclipselink.logging.level" value="FINEST" /> 
    <property name="eclipselink.logging.level.sql" value="FINEST" /> 

Затем найти запросы SQL для findById и getSkills и запустить их в базе данных.

И, пожалуйста, обновите вопрос с полученным результатом для данного идентификатора (как сгенерированного SQL, так и с подтверждением того, что данные в порядке).

0

Просто попробуйте использовать em.flush(), это работа для меня;

Query q = em.createNamedQuery("Volunteer.findById").setParameter("id", id); 
vo = (Volunteer) q.getSingleResult(); 
em.flush(); 
for(Skill s: vo.getSkills()){ 
    System.out.println(s); 
} 
0

Наиболее распространенная проблема с двунаправленными отношениями, когда пользователи не поддерживают обе стороны - JPA сущности являются простыми объектами Java, и JPA не устанавливает отношения для вас, как EJB 2.0 используется для. Когда вы добавляете волонтера к навыку, вы также должны добавить навык к добровольцу, чтобы кеш оставался в синхронизации с изменениями, которые вы форсируете в базе данных.

Смежные вопросы