Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解释

简介: @jsonignore的作用作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。 http://www.cnblogs.com/toSeeMyDream/p/4437858.

@jsonignore的作用
作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。

http://www.cnblogs.com/toSeeMyDream/p/4437858.html


当表间有One2Many或Many2One时,会发生无限循环的场景,如何破?

只要在Set方法前增加以下注解即可:

    @JsonIgnore  
    public Set xxxs() {
        return this.xxxYyyy;
    }

http://www.cnblogs.com/tompandas/p/4618668.html

 

 

1、@Transient

@Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性;
如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则ORM框架默认其注解为@Basic;

//表示该字段在数据库表中没有

@Transient
public int getAge() {
 return 1+1;
}

 

Jackson相关:

2、@JsonIgnoreProperties

此注解是类注解,作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。

 

3、@JsonIgnore

此注解用于属性或者方法上(最好是属性上),作用和上面的@JsonIgnoreProperties一样。

 

4、@JsonFormat

此注解用于属性或者方法上(最好是属性上),可以方便的把Date类型直接转化为我们想要的模式,比如@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss")

 

5、@JsonSerialize

此注解用于属性或者getter方法上,用于在序列化时嵌入我们自定义的代码,比如序列化一个double时在其后面限制两位小数点。

 

6、@JsonDeserialize

此注解用于属性或者setter方法上,用于在反序列化时可以嵌入我们自定义的代码,类似于上面的@JsonSerialize

http://www.cnblogs.com/guijl/p/3855329.html

 

hibernate懒加载和json序列化冲突

假设某 POJO 有属性如下:

private Set<User> users = new HashSet<>(0);

@OneToMany(fetch = FetchType.LAZY, mappedBy = "xuser")
 public Set<User> getUsers() {
    return this.users;
}

如果我们使用jackson将其序列化,运行时会报错:

failed to lazily initialize a collection of role ...

 

解决方法一:

通过 Hibernate 的 OpenSessionInViewFilter 使得 FetchType 为 LAZY 的属性在序列化时为空,在 web.xml 中添加代码如下:

复制代码
<filter>  
    <filter-name>openSession</filter-name>  
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>  
    <init-param>  
        <param-name>singleSession</param-name>  
        <param-value>false</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>openSession</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>
复制代码

尽管 users 为空,但字段依然保留,对应输出:

{...,"users":[],...}

 

解决方法二:

在属性的 get 方法之前加上注解 @JsonIgnore,如此在转换为 JSON 时该字段被忽略:

复制代码
import com.fasterxml.jackson.annotation.JsonIgnore;
 
private Set<User> users = new HashSet<>(0);
@JsonIgnore
@OneToMany(fetch = FetchType.LAZY, mappedBy = "xuser")
 public Set<User> getUsers() {
    return this.users;
}
复制代码

注意引入的类是 com.fasterxml.jackson.annotation.JsonIgnore,如果使用 org.codehaus.jackson.annotate.JsonIgnore 则不能生效,见 Spring @JsonIgnore not working

 

解决方法三:

fetch = FetchType.LAZY 改为 fetch = FetchType.EAGER,但这样会导致每次查询数据库都要立即提取 OneToMany 的所有对象,所以非常不推荐

http://www.cnblogs.com/gugia/p/5117735.html

 

因为懒加载这个对象属性只是一个代理对象,如果json直接当作一个存在的属性去序列化就会出现错误,所以就只能这样了,当然还有其他办法吧

或者在class上加上

@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
public class ProductPrice {

或者在这个对象的属性上面增加 @JsonIgnore 注解

@JsonIgnore
public Set<User> getUsers() {
return this.users;
}

实际我们要做的目的就是为了在MappingJackson2HttpMessageConverter通过aop转化为json的时候不去理这个属性

http://www.cnblogs.com/cbread/p/4017987.html

作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。

如下:

package com.hzboy.orm;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonManagedReference;


/**
 * 系统用户实体类
 * @author tinner
 *
 */
@Entity(name = "com.hzboy.orm.User")
@Table(name = "sys_user")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class User extends BaseEntity {

    /**
     * 
     */
    private static final long serialVersionUID = -1343842065506227012L;

    public User() {

    }

    public User(Integer id) {
        this.id = id;
    }

    // 登录名
    private String loginName;
    // 密码123456-b594510740d2ac4261c1b2fe87850d08
    private String pswd;
    // 姓名
    private String nickName;
    // 性别
    private Short sex;
    // 年龄段
    private String ageStage;
    // 是否系统管理员
    private boolean systemAdmin;
    //联系电话
    private  String  tel;
    //Email
    private  String  email;
    //是否工程师
    private  Boolean  isEnginner;
    //是否前端客户    是则显示前台html,但同时保留后台相关模块
    private  Boolean  isFrontUser;
    //相关部门
    private  Department  department;
    //相关部门前台描述
    private  String   departmentName;
    private  Integer  departmentId;
    //用户编号
    private  String  userCode;
    //附加用于导入
    private  String  idCode;
    //附加的部门信息  用于计算
    private  String  departmentCode;
    @Column(name = "login_name")
    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    @Column(name = "pswd")
    public String getPswd() {
        return pswd;
    }

    public void setPswd(String pswd) {
        this.pswd = pswd;
    }

    @Column(name = "nick_name")
    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    @Column(name = "sex")
    public Short getSex() {
        return sex;
    }

    public void setSex(Short sex) {
        this.sex = sex;
    }

    @Column(name = "age_stage")
    public String getAgeStage() {
        return ageStage;
    }

    public void setAgeStage(String ageStage) {
        this.ageStage = ageStage;
    }

    @Column(name = "system_admin")
    public boolean isSystemAdmin() {
        return systemAdmin;
    }

    public void setSystemAdmin(boolean systemAdmin) {
        this.systemAdmin = systemAdmin;
    }

    private List<Role> roles;

    @ManyToMany(fetch = FetchType.LAZY, cascade = (CascadeType.REMOVE))
    @JoinTable(name = "sys_user_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") })
    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    private Integer[] roleIds;

    @Transient
    public Integer[] getRoleIds() {
        return roleIds;
    }

    public void setRoleIds(Integer[] roleIds) {
        this.roleIds = roleIds;
    }
    @Column(name="email")
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    @Column(name="is_enginner")
    public Boolean getIsEnginner() {
        return isEnginner;
    }

    
    public void setIsEnginner(Boolean isEnginner) {
        this.isEnginner = isEnginner;
    }
    @Column(name="is_front_user")
    public Boolean getIsFrontUser() {
        return isFrontUser;
    }

    public void setIsFrontUser(Boolean isFrontUser) {
        this.isFrontUser = isFrontUser;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }
    @JsonIgnore 
    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.LAZY)  
    @JoinColumn(name="department_id")
    public Department getDepartment() {
        return department;
    }
    @JsonManagedReference
    public void setDepartment(Department department) {
        this.department = department;
    }
    
    @Transient
    public String getDepartmentName() {
        return departmentName;
    }

    public void setDepartmentName(String departmentName) {
        this.departmentName = departmentName;
    }
    
    @Transient
    public Integer getDepartmentId() {
        return departmentId;
    }

    public void setDepartmentId(Integer departmentId) {
        this.departmentId = departmentId;
    }
    @Column(name="user_code")
    public String getUserCode() {
        return userCode;
    }

    public void setUserCode(String userCode) {
        this.userCode = userCode;
    }
    @Column(name="id_from_import")
    public String getIdCode() {
        return idCode;
    }

    public void setIdCode(String idCode) {
        this.idCode = idCode;
    }
    public String getDepartmentCode() {
        return departmentCode;
    }

    public void setDepartmentCode(String departmentCode) {
        this.departmentCode = departmentCode;
    }
}

上个实体User中的  department属性就在getDepartment属性上加了  @JsonIgnore,这个时候从后台推数据到前台的时候,就会把department这个引用属性给忽略掉。

http://www.mamicode.com/info-detail-578520.html

 

相关文章
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
286 3
|
SQL Java 数据库连接
springBoot+Jpa(hibernate)数据库基本操作
springBoot+Jpa(hibernate)数据库基本操作
328 0
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
503 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
|
Java 数据库连接 数据库
携手前行:在Java世界中深入挖掘Hibernate与JPA的协同效应
【8月更文挑战第31天】Java持久化API(JPA)是一种Java规范,为数据库数据持久化提供对象关系映射(ORM)方法。JPA定义了实体类与数据库表的映射及数据查询和事务控制方式,确保不同实现间的兼容性。Hibernate是JPA规范的一种实现,提供了二级缓存、延迟加载等丰富特性,提升应用性能和可维护性。通过结合JPA和Hibernate,开发者能编写符合规范且具有高度可移植性的代码,并利用Hibernate的额外功能优化数据持久化操作。
178 0
|
数据库 开发者 Java
Hibernate映射注解的魔力:实体类配置的革命,让你的代码量瞬间蒸发!
【8月更文挑战第31天】Hibernate 是一款出色的对象关系映射框架,简化了 Java 应用与数据库的交互。其映射注解让实体类配置变得直观简洁。本文深入剖析核心概念与使用技巧,通过示例展示如何简化配置。
197 0
|
Java 数据库连接 数据库
Spring Data JPA 与 Hibernate 之区别
【8月更文挑战第21天】
414 0
|
SQL Java 数据库连接
Hibernate 和 JPA 有什么区别?
【8月更文挑战第21天】
915 0
|
缓存 Java 数据库连接
深入理解Java中的JPA与Hibernate
深入理解Java中的JPA与Hibernate
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
【6月更文挑战第25天】在Java持久层,Hibernate与JPA提供ORM及数据库操作简化。JPA是EE规范,定义ORM接口;Hibernate是其实现,功能丰富。在一个在线书店项目中,使用@Entity标注实体类如Book,通过JpaRepository接口(如BookRepository)进行数据访问。服务层调用仓库接口方法,如搜索书籍。当需自定义查询时,可使用JPQL或SQL。Spring的@Transactional注解处理事务管理,展示出高效开发流程。
145 0
|
SQL 缓存 Java
Java持久化新篇章:Hibernate与JPA的进阶探索
【6月更文挑战第25天】在Java持久化技术中,Hibernate和JPA日益发展,本文以电商系统为例,展示它们的新特性和进阶应用。JPA通过注解如@Entity实现对象-关系映射,EntityManager处理CRUD操作。Hibernate则扩展了JPA,提供二级缓存、自定义HQL/SQL查询及批量操作,如批量更新商品价格,显示了其在性能优化和复杂需求上的灵活性。两者在现代Java开发中不可或缺。
117 0

热门文章

最新文章