我有四个实体:计划,事件,位置(对于此示例不重要)和EventLocation。 OneToOne映射是Schedule - >位置 - > EventLocation - >事件
Schedule.java
@Entity
@Table(name="Schedule")
@NamedQuery(name="Schedule.findAll", query="SELECT s FROM Schedule s")
public class Schedule implements Serializable {
@Id
private int scheduleId;
@Temporal(TemporalType.DATE)
private Date date;
private int locationId;
@OneToOne
@PrimaryKeyJoinColumn(name = "locationId")
private Location location;
...
}
Event.java
@Entity
@Table(name="Events")
@NamedQuery(name="Event.findAll", query="SELECT e FROM Event e")
public class Event implements Serializable {
@Id
private int eventId;
private String eventName;
...
}
Location.java:
@Entity
@Table(name="Locations")
@NamedQuery(name="Location.findAll", query="SELECT l FROM Location l")
public class Location implements Serializable {
@Id
private int locationId;
private String locationName;
@OneToOne
@PrimaryKeyJoinColumn(name = "locationId")
private EventLocation eventLocation;
...
}
EventLocation.java
@Entity
@Table(name="EventLocations")
@NamedQuery(name="EventLocation.findAll", query="SELECT e FROM EventLocation e")
public class EventLocation implements Serializable {
@Id
private int eventLocationId;
private int eventId;
private int locationid;
@OneToOne
@PrimaryKeyJoinColumn(name = "eventId")
private Event event;
...
}
注意:我无法更改数据库的布局。
我执行查询
SELECT schedule FROM Schedule schedule WHERE (schedule.location.eventLocation.eventLocationId<>0 )
我可以浏览参考资料。例如,当我执行
时,事件ID是正确的System.out.println(curScheduleItem.getLocation().getEventLocation().getEvent().getEventId())
但是,如果我执行以下查询,则不会返回任何结果,也不会生成错误。
SELECT schedule FROM Schedule schedule WHERE (schedule.location.eventLocation.eventId<>0 )
eventId在数据库中从不为零,并且有与此查询匹配的记录,但jpa查询返回空结果集。如果我执行:
,也会发生同样的情况SELECT schedule FROM Schedule schedule WHERE (schedule.location.eventLocation.locationId<>0 )
这就像JPA不喜欢eventId或locationId,而是eventLocationId 很好。并且,就像我说的,如果我在没有eventId或locationId的情况下进行查询,那么检查结果中的eventId和locationId,它们是正确的。
我做错了什么以及如何解决?
答案 0 :(得分:0)
我会尝试更详细的登录以查看正在执行的SQL语句。有关详细信息,请参阅http://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging,&lt; property name =“eclipselink.logging.level.sql”value =“FINE”/&gt;可能是你需要的那个。 猜测'schedule.location.eventLocation.locationId'被翻译为所有映射表的内连接。确保所有连接表中都有正确的记录。
答案 1 :(得分:0)
我会直接查询数据库,看看各个表中存在哪些数据,你定义的很多关系都是可选的,你没有级联持久化,所以在代码中它可能看起来没问题,但是什么是写入数据库并不是所有记录都被写入。
我还假设&#34; locationId&#34;在Schedule实体上是一个错误。
答案 2 :(得分:0)
非常感谢医生
启用日志记录后,我注意到了这个问题。在位置, @PrimaryKeyJoinColumn(name =&#34; locationId&#34;)
不正确。 JPA试图通过匹配Location.locationId和EventLocation.eventLocationId来加入EventLocation。据我了解,JPA不允许连接外键,因此无法完成。如果我想让它工作,数据库必须重组。