Двунаправленное сопоставление OneToMany / ManyToOne в задаче OpenJPA JPQL - PullRequest
1 голос
/ 11 февраля 2011

У меня есть два класса с двунаправленной связью:

@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.

1 Ответ

2 голосов
/ 11 февраля 2011

Я не уверен на 100%, является ли это причиной, но создание переменной walls final выглядит странно

Удалите маркер final и попробуйте снова.

...