2010-09-14 98 views
1

嗨我有一个问题,从志愿者获取技能。由于某种原因,我不使用这种方法ManyToMany JPA取得

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; 

} 

列表为空当,因此取似乎并没有工作获取列表。

进出口使用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或EAGER获取类型,你应该得到的技能记录对于给定的志愿者,如果有任何。

而且由于映射看起来是正确的,我会通过查看生成的SQL启动并运行它针对数据库,以确认

  1. 生成的SQL是预期的结果
  2. 的数据是正确的。

要做到这一点,设置在persistence.xml以下属性:

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

然后找到该findByIdgetSkills的SQL查询和运行它们的数据库。

然后请更新问题与获得的结果为一个给定的ID(生成的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对象,并为你喜欢的EJB 2.0使用JPA不能修复关系。当您将志愿者添加到技能时,您还必须将技能添加到志愿者,以便缓存与您在数据库中强制进行的更改保持同步。