2011-02-11 109 views
1

我有两个班,一个bidrectional关系:双向一对多/多对一映射OpenJPA中JPQL问题

@Entity 
@Access(AccessType.FIELD) 
@Table(name="ROOM") 
public class Room { 
    @Id 
    @GeneratedValue 
    @Column(name="ROOM_ID_PK", updatable=false, nullable=false) 
    private int id; 
    @Column(name="NAME", nullable=false, unique=true) 
    private String name; 
    @OneToMany(mappedBy="room", cascade={CascadeType.ALL}) 
    private final Set<Wall> walls; 
    ... 
} 

@Entity 
@Access(AccessType.FIELD) 
@Table(name="WALLS") 
public class Wall { 
    @Id 
    @GeneratedValue 
    @Column(name="WALL_ID_PK", updatable=false, nullable=false) 
    private int id; 
    @Column(name="NAME", nullable=false, unique=true) 
    private String name; 
    @ManyToOne 
    @JoinColumn(name="ROOM_ID_FK", referencedColumnName="ROOM_ID_PK") 
    private Room room; 
    ... 
} 

我运行MySQL - 是什么样子会产生一个健全一套表:

ROOMS: INT ROOM_ID_PK, VARCHAR NAME 
WALLS: INT WALL_ID_PK, VARCHAR NAME, INT ROOM_ID_FK 

然而,当我执行JPQL查询

SELECT w FROM Wall w, Room r WHERE w MEMBER OF r.walls AND r = :room 

我得到一个错误:

PropertyAccessException 1: org.springframework.beans.MethodInvocationException: 
Property 'wall' threw exception; nested exception is <openjpa-2.0.1-r422266:989424 
nonfatal user error> org.apache.openjpa.persistence.ArgumentException:An error occurred 
while parsing the query filter "SELECT w FROM Wall w, Room r WHERE w MEMBER OF r.walls 
AND r = :room". Error message: No field named "walls" in "Room". Did you mean "name"? 
Expected one of the available field names in "mypackage.Room": "[id, name]". 

由于某些原因,“墙”不被视为Room类的字段。这段代码工作在休眠状态 - 我试图迁移到OpenJPA,但遇到了这个错误。我已经确认这两个类都在我的persistence.xml中定义。

回答

2

我不是100%确定是否它的原因,但使walls变量final看起来很奇怪。

因此,请删除final标记,然后再试一次。