【问题标题】:Hibernate is persisting zero instead of double valuesHibernate 保持零而不是双值
【发布时间】:2016-09-19 19:49:47
【问题描述】:

我使用 Spring Boot 1.3.7.RELEASE 作为应用框架,Hibernate 作为 JPA 实现,Spring Data 作为数据访问接口,MySQL 5.7.15 作为存储服务器。我有两个模型:AgencyServiceAreaCoverageAgency 目前具有 oneToOne 单向与 ServiceAreaCoverage。这是我的应用程序模型和映射。

@Entity
@Table(name = "agencies")
public class Agency {

    @Id
    private String id;
    private String name;
    private long phoneNumber;
    private String email;
    private String websiteUrl;
    private boolean active;

    @OneToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "service_area_coverage_id")
    private ServiceAreaCoverage serviceAreaCoverage;
}


@Entity
@Table(name = "service_area_coverages")
public class ServiceAreaCoverage {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private double latitude;
    private double longitude;
    private double latitudeSpan;
    private double longitudeSpan;
}

我正在尝试使用 Spring Data JpaRepository 的保存方法将 AgencyServiceAreaCoverage 一起保存。 AgencyServiceAreaCoverage 都得到了保存,关键约束也得到了适当的管理。但是,double 值没有得到保存。而不是双值,零被保存。我想不出发生这种结果的任何原因,也想不出故障排除的想法。因此,任何帮助都将不胜感激。这是我与此事相关的一些其他代码和参考。

服务代码:

@Service
public class AgencyServiceImpl implements AgencyService {

    @Autowired
    private AgencyRepository agencyRepository;

    @Override
    public void createAgency(Agency agency) {

    this.agencyRepository.save(agency);
    }
}

存储库接口代码:

@Repository
public interface AgencyRepository extends JpaRepository<Agency, String> {

}

生成的表详细信息: 机构表:

ServiceAreaCoverage 表:

【问题讨论】:

  • 你能告诉我们你的数据库表的结构吗?
  • 您好@Beethoven,我添加了生成的表结构的屏幕截图。谢谢你关注这个问题。
  • 嗯,还看不到,可能出了什么问题。只是一些一般的故障排除思路: 1.字段名称是否与相应的数据库列不同,例如latitudeSpan/latitude_span 映射正确,在某个地方? 2. 一个重要的地方当然是设置双字段的值。 3. 设置logger 'org.hibernate.SQL' 来调试查看Hibernate 生成的SQL 查询通常很有用。
  • 您使用的是哪个数据库?请分享存储在 db 中的归零双数据的屏幕截图。
  • 您的意思是任何双精度值(10.52)都存储为 0。还是 0.0 存储为 0?如果是第一个,请分享用于保存双精度值的整个代码。此外,详细说明为 Agency 和 ServiceAreaCoverage 类编写的代码。我想看看这些类的 getter/setter。

标签: java hibernate jpa spring-boot


【解决方案1】:

我想这可能对你有帮助。

您应该使用包装类而不是原语。 请在 ServiceAreaCoverage 类中将 double 更改为 Double,因为它甚至可以保存 null 值。确保 getter/setter 是 Double 而不是 double。

@Entity
@Table(name = "service_area_coverages")
public class ServiceAreaCoverage {
 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)
 private Long id;
 private Double latitude;
 private Double longitude;
 private Double latitudeSpan;
 private Double longitudeSpan;
}

注意:当DB列设置为not-null="true"时,不能使用原语double。
始终使用包装类,因此您不必考虑 0 或 null。

【讨论】:

  • 抱歉耽搁了,我很忙。不幸的是,这也不起作用。但是,在此更改之后,我开始获得 NPE。而且我注意到,如果我将级联更改为合并,那么休眠也会成功持久化 ServiceAreaCoverage。查看日志,在 PERSIST 情况下,休眠首先插入代理对象,然后执行其他级联任务。在 MERGE 情况下,hibernate 在插入代理对象之前首先插入 ServiceAreaCoverage 对象。我仍在详细研究这两个级联操作是如何工作的。当事情变得更清楚时,我会通知你。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 2011-01-12
  • 2020-11-14
相关资源
最近更新 更多