java - OpenJPA JPQL 问题中的双向 OneToMany/ManyToOne 映射

标签 java jpa persistence openjpa

我有两个具有双向关系的类:

@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 类的字段。这段代码在 hibernate 状态下工作——我试图迁移到 OpenJPA,但遇到了这个错误。我已经确认这两个类都在我的 persistence.xml 中定义。

最佳答案

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

因此,请删除 final 标记,然后重试。

关于java - OpenJPA JPQL 问题中的双向 OneToMany/ManyToOne 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4969929/

相关文章:

java - 指令 "filled-new-array"什么时候出现?

JavaScript 变量作用域 - 持久状态?

java - 春+ hibernate : LocalSessionFactoryBean - NoSuchMethodError: org. hibernate.cfg.annotations.reflection.XMLContext

Java 初学者 : the mechanism behind "|" operator in Shell s = new Shell(d, SWT.CLOSE | SWT.调整大小);

Java:组件如何知道它的所有者

java - 即使solve() 方法返回 true,IloCplex.solve() 仍无法满足所有约束

java - 在 JPA 中以一对一关系共享主键的情况下如何访问对象?

java - Spring 将entitymanager getResultList结果转换为JSON

java - Spring Boot - 无法确定数据库类型 NONE 的嵌入式数据库驱动程序类

iphone - 相关实体的 iOS 核心数据持久化