2016-09-19 62 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對象。我仍在詳細探討這兩個級聯操作是如何工作的。當事情變得更加清晰時,我會通知你。謝謝 –

相關問題