首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确持久化JSON对象

正确持久化JSON对象
EN

Stack Overflow用户
提问于 2015-02-16 13:25:37
回答 3查看 907关注 0票数 0

我有以下课程:

代码语言:javascript
复制
public class Entity {

@Id 
@GeneratedValue(strategy = GenerationType.AUTO)
private Long Id;
private String name;

@JsonManagedReference
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Category category;

//Constructors, getters and setters
}


public class Category {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long Id;
private String name;

@JsonBackReference
@OneToMany(mappedBy = "category", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Entity> entity;

//Constructors, getters and setters
}

我有一个表单,当我提交表单时,我得到以下JSON:

代码语言:javascript
复制
{
 id: "1"
 name: "EntityA"
 category: {    
    id: "4"
    name: "categoryA"
 }
}

CategoryA已经在数据库中了。当我将EntityA对象(主对象)持久化到数据库时,两个对象都将被持久化。

这是怎么回事?

问题是,该类别将再次持久化,使用相同的信息,但具有不同的id。因此,当我持久化上面的对象时,EntityA在数据库中保持得很好,但是类别再次以不同的id持久化,即使它存在于数据库中。

下面是数据库观点的步骤。

初始数据库:

实体表(空)

代码语言:javascript
复制
|id | name | category_id |
--------------------------
|   |      |             |

分类表

代码语言:javascript
复制
| id | name    |
----------------
|  4 |categoryA|

Entity_category表(空)

代码语言:javascript
复制
| entity_id | category_id |
---------------------------
|           |             | 

持久化后的

实体表(空)

代码语言:javascript
复制
id | name  | category_id |
--------------------------
 1 |EntityA| 5           |

Entity_category表(不应该为空,而是为空)

代码语言:javascript
复制
| entity_id | category_id |
---------------------------
|           |             | 

分类表

代码语言:javascript
复制
id | name    |
--------------
 4 |categoryA|
 5 |categoryA|

我想要的只是当我持久化EntityA对象时,它不会持久化类别,而是更新它与EntityA的关系。持久化后,第二个视图的category_id应该是4而不是5。

我使用实体管理器的持久性()方法来持久化对象。

我使用的技术有jackson 2.0、Hibernate、Postgres作为数据库。

我还测试了两个类上面的@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")注释,但这没有帮助。

我在这里做错了什么?任何帮助都是非常感谢的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-27 17:50:20

好了,我终于找到了解决办法。整个问题是因为我的json类别对象键" id“是用小"I”字母编写的,这意味着它找不到类别id,因为它与实体类的Id字段不匹配,从而生成一个带有null id的类别。这就是为什么它将类别保持为新实体的原因,因为在反序列化过程之后,它无法在数据库中找到这样的对象。

确保在持久化json对象时,中的每个键必须与实体类字段或属性完全匹配。

票数 0
EN

Stack Overflow用户

发布于 2015-02-16 13:45:06

您还没有将Id标记为主键(@Id)到实体中。在您的例子中,id似乎是一个自动增量列(这就是为什么id不同于您插入的内容),而且JPA无法检测到对象是同一个对象。尝试用注释@Id @GeneratedValue标记ID字段,然后再试一次。

票数 2
EN

Stack Overflow用户

发布于 2015-02-16 13:53:28

尝试获取对类别的引用,并在提交/合并之前手动设置引用(如果在数据库中找到该引用):

代码语言:javascript
复制
Category category = em.find(Category.class, entity.getCategory().getId());
if (category!=null){
  entity.setCategory(category);
}

这样,类别将是一个附加的对象。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28542468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档