我有 2 个实体,比如 Car 和 Engine(只是示例名称,但逻辑是相同的)。
@Entity
public class Car {
@Id
private Long id;
@OneToOne(mappedBy = "car", cascade = Cascade.ALL)
private Engine engine;
...
}
@Entity
public class Engine {
@Id
private Long id; // 1
@MapsId // 2
@OneToOne
@JoinColumn(name = "car_id") // join column is optional here
private Car car;
...
}
所以,然后我做:
em.save(car); // successfully saved, data is in the database, but (see below)
TypedQuery<Engine> query = em.createQuery("select engine from Engine engine where engine.car = :car", Engine.class)
query.setParameter("car", car);
query.getResultList();
抛出异常:
ERROR [main] (JDBCExceptionReporter.java:234) - No value specified for parameter 1.
WARN [main] (TestContextManager.java:409) - Caught exception while allowing TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener@17e5cbd] to process 'after' execution for test: method , exception [org.springframework.orm.jpa.JpaSystemException: org.hibernate.exception.DataException: could not execute query; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.DataException: could not execute query]
但是,如果我将引擎实体更改为在汽车实例本身上只有 @Id(删除 //1 并将 //2 更改为 @Id)它可以工作。
根据 JPA 文档,它应该以相同的方式工作(至少我预期)。
我的环境:PostgreSQL 9、Spring framework 3.1、Hibernate 3.6.8.Final、Tomcat 7(JPA 支持由 Spring 工具添加)。
更新:我已经用 EclipseLink 尝试了这两种映射并且它有效。所以问题可能出在Hibernate的某个地方。仍然不知道如何强制它与 Hibernate 一起工作。