2016-09-19 60 views
1

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

@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数据JpaRepository的保存方法保存AgencyServiceAreaCoverageAgencyServiceAreaCoverage都得到保存,关键约束也得到妥善管理。但是,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> { 

} 

生成的表格详细说明: 机构表: enter image description here

ServiceAreaCoverage表: enter image description here

+0

你能告诉我们你的数据库表的结构吗? – Beethoven

+0

Hello @Beethoven,我添加了生成的表结构的屏幕截图。谢谢你看这件事。 –

+0

哼,看不清楚,怎么会出问题。以下是一些常见的故障排除建议:1.字段的名称是否与相应的数据库列名称不同'latitudeSpan' /'latitude_span'正确映射,某处? 2.当然,重要的一点是设置双字段的值。 3.将logger'org.hibernate.SQL'设置为调试以查看由Hibernate生成的SQL查询通常很有用。 – Beethoven

回答

0

我认为这可能会对你有所帮助。

你应该使用包装类而不是原语。 请在ServiceAreaCoverage类中更改双倍至Double,因为它甚至可以保留空值。确保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; 
} 

注:不能使用基本的double当DB列设置为不空=“真”
总是使用包装类,所以你不必考虑为0或null。

+0

这是否适合您? –

+0

对不起,我很忙。不幸的是,这不起作用。然而在这个变化之后,我开始获得NPE。我注意到,如果我改变级联合并,然后冬眠成功坚持ServiceAreaCoverage。查看日志,在PERSIST情况下,hibernate首先插入代理对象,然后执行其他级联任务。在MERGE情况下,hibernate在插入代理对象之前首先插入ServiceAreaCoverage对象。我仍在详细探讨这两个级联操作是如何工作的。当事情变得更加清晰时,我会通知你。谢谢 –

相关问题