2017-02-21 126 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

你不需要两个类。