【问题标题】:Spring jpa - oneToOne not selecting data from secondary table - mySqlSpring jpa - oneToOne 不从辅助表中选择数据 - mySql
【发布时间】:2017-10-20 01:02:46
【问题描述】:

Spring 数据新手,遇到无法解决的问题。有一个 mySql 数据库,我正在尝试使用 OneToOne 通过外键从表中获取数据。

Table 1 - location
   id      int(11) pk nn UQ
   zipcode varchar(11) NN UQ
   city    varchar(45) NN
   lat     Double      NN
   lon     Double      NN

Table 2 - weather
   id           INT(11)  PK NN
   location_id  INT(11)  NN
   desc         varchar(45)  NN
Foreign Key name fk_location_id  referenced table location column location_id referenced column id - pointed to location column id.`

WeatherData.java 列定义 @OneToOne (fetch = FetchType.LAZY) @JoinColumn(name="fk_location_id") private LocationData location;

执行查询的代码: for (WeatherData weather : repository.findAll()) { log.info(weather.toString()); }

` 在上面的代码中为 log.info 行设置一个断点,然后查看返回的天气记录。位置值为空。已尝试将 OneToOne 列名称设置为 id,但未成功。

我做错了什么?

【问题讨论】:

    标签: java mysql jpa spring-data


    【解决方案1】:

    我会尝试以下 3 件事:

    1. 将@JoinColumn 中的值设置为FK 列的名称。
    2. 确保您的 FK 实体类 (LocationData) 具有格式正确的 @OneToOne 注释。 mappedBy 值是 WeatherData 中具有 @OneToOne 和 @JoinColumn 注释的字段的名称。
    3. 确保您的实体类被注释为实体(通过@Entity)。

    使用此站点的example,您的天气表将是 book 表,而 location 将是 book_detail 表。话虽如此,有一些注释可以确保您正在使用。首先,确保您的实体类被标记为如此。即:

     @Entity
     @Table(name = "weather")
     public class WeatherData {
    

    如果你的实体类和表同名,那么可以省略@Table注解;但是,我喜欢总是添加它,因为我认为这是一种很好的做法。确保注释所有实体类,而不仅仅是 WeatherData。现在,对于 location_id,您的 @JoinColumn 应该引用表中的列。

    @OneToOne (fetch = FetchType.LAZY)
    @JoinColumn(name="location_id")
    private LocationData location;
    

    然后,在 LocationData 类中,您还需要使用 @OneToOne 注释 locationId 字段。

    @OneToOne(mappedBy = "location")
    private WeatherData weather;
    

    查看链接文章了解更多信息。我希望这会有所帮助。

    【讨论】:

    • 已按照您提供的链接中的示例进行操作。确实将我的 fetch 选项更改为急切的 fetch,现在我得到了位置表的 toString 覆盖的转换异常。不知道为什么,没有调用位置覆盖的 toString 方法。
    【解决方案2】:

    通过以下更改修复了该问题:

    @OneToOne (fetch = FetchType.EAGER) @JoinColumn(name="location_id") private LocationData location;

    并修复了在 locationdata 类中应该是字符串时定义为 int 的不正确数据类型。在 locationdata toString 方法中将双精度集设置为 int 也存在问题。

    【讨论】:

    • 好。我很高兴你能弄清楚。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2014-10-21
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    相关资源
    最近更新 更多