2017-02-21 130 views
0

我有兩個具有相同字段的類。但是,其中一個用於JSON ,另一個用於JPA實體。我想將JSON 對象(學生)轉換爲JPA實體(StudentEntity)。我嘗試將JSON類 解析到JPA類中,但它不允許。如何將(Student)Json類轉換爲(StudentEntity)類,以便我可以使用JSON類中的信息從JPA Entity Class中持久化數據庫?Java:將Jackson(JSON)類轉換成實體(JPA)類

package com.student.entity; 

import java.io.Serializable; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name = "Student") 
public class StudentEntity implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Column(nullable = false, updatable = false) 
    @GeneratedValue 
    private long studentID; 

    private String fName; 
    private String lName; 

    private Address address; 

    public long getStudentID() { 
     return studentID; 
    } 

    public void setStudentID(long studentID) { 
     this.studentID = studentID; 
    } 

    public String getfName() { 
     return fName; 
    } 

    public void setfName(String fName) { 
     this.fName = fName; 
    } 

    public String getlName() { 
     return lName; 
    } 

    public void setlName(String lName) { 
     this.lName = lName; 
    } 

    public Address getAddress() { 
     return address; 
    } 

    public void setAddress(Address address) { 
     this.address = address; 
    } 
} 

package com.ejb.objectmapper.entity.student; 

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 
import com.fasterxml.jackson.annotation.JsonProperty; 

@JsonIgnoreProperties("studentID") 
public class Student { 
    private long studentID; 
    @JsonProperty 
    private String fName; 
    @JsonProperty 
    private String lName; 

    private Address address; 

    public long getStudentID() { 
     return studentID; 
    } 

    public void setStudentID(long studentID) { 
     this.studentID = studentID; 
    } 

    public String getfName() { 
     return fName; 
    } 

    public void setfName(String fName) { 
     this.fName = fName; 
    } 

    public String getlName() { 
     return lName; 
    } 

    public void setlName(String lName) { 
     this.lName = lName; 
    } 

    public Address getAddress() { 
     return address; 
    } 

    public void setAddress(Address address) { 
     this.address = address; 
    } 
} 
+0

爲什麼不創建一個轉換器方法並使用getters和setter來使用JSON類中的值創建一個新的實體? 顯然,你不能只將學生投給StudentEntity,因爲他們沒有任何關聯。 – Arqan

+0

轉換器方法是一個簡單而優雅的解決方案,每個人讀你的代碼都會知道它的用途。我想你可以使用反射來設置字段,因爲它們是相同的類型,但爲這樣一個簡單的任務做這件事的想法對我來說聽起來很荒謬。 – Arqan

回答

0

另一種方法是使用Jackson的Mixin feature

這實際上可以讓您擺脫Student類(如果可能),並將JSON直接解組到StudentEntity類的新實例。

這種方法在很大程度上取決於您的web應用程序的複雜程度,以及您依賴於如何堅持DTO模式。 Spring Data REST這是非常成功的。事實上,由於您已經在使用JPA,我會推薦它(如果它適合您的用例),並且與Spring的許多事情一樣,您會獲得許多「免費」內容。

+0

詳細說明,這是一種類似於@raminr建議的方法,除非您可以通過將Jackson註釋保留在獨立的類(或接口! – Maynestream

0

你可以使用一些映射框架爲,即推土機(http://dozer.sourceforge.net)或MapStruct(http://mapstruct.org

使用推土機複製類歸結爲簡單的東西as

dozer.map(jsonObject,Entity.class); 
+0

謝謝。我一直在使用Dozzer Mapper。但我正在嘗試不使用任何API。 – greencheese

+0

嗯,沒有任何API,你必須手工編寫...做基本相同的推土機或Mapstruct;) – tom

+0

哈哈... :) MapStruct是我的新手,我會嘗試這一個。謝謝:) – greencheese

0

什麼是你使用MVC?如果您使用Spring MVC,則可以使用JPA實體來表示JSON負載。適合我們。只需使用Jackson註釋來控制行爲,如@JsonIgnore

你不需要兩個類。