小编Tod*_*tch的帖子

由于循环依赖,在基类以外的东西上指定 Jackson JSON 子类型

我们遇到的基本问题是,当存在类型为基类的属性可以是多个子类中的任何一个时,如何处理 JSON 的反序列化。关于这个主题有很多问题,绝大多数似乎都指向基类上 JSONSubTypes 注释的使用。

一般示例如下所示,其中动物可以是多种类型 - 狗、猫、马等.....

public class Pets {

   private List<Animal> myPets;

   public List<Animal> getMyPets(){
        return myPets;
   }

}
Run Code Online (Sandbox Code Playgroud)

埋在注释中的通常是反对每次添加子类时更改基类的要求的注释。考虑以下示例。如果创建了一个“Horse”类并需要使用一个新类型,则需要将一个新类型添加到 Horse 类的 JsonSubTypes 列表中。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),
@JsonSubTypes.Type(value = Cat.class, name = "Cat") }
)
public abstract class Animal {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
Run Code Online (Sandbox Code Playgroud)

这里的问题是如果基类和所有子类不存在于同一个 jar 文件中怎么办?您现在最终会遇到循环依赖。子类依赖于带有基类的 jar 文件,基类依赖于带有子类的 jar。

JAXB …

java polymorphism json jackson

5
推荐指数
1
解决办法
3477
查看次数

Hibernate合并和刷新不会持久更改对象

这是关于更新数据库中对象的Hibernate/JPA问题.

我有一个使用entityManager.persist(object)在另一个事务中创建的对象.

返回此对象,然后更新某些值.然后在另一个使用@Transactional注释的方法中进行调用.此方法调用基类中的合并方法(如下所示).

在以下代码中,rvalue具有已修改的信息,直到调用刷新为止.调用刷新后,数据将恢复为原始值.

我希望对flush()的调用会将信息保存到数据库中.

我试着评论刷新调用,认为保存不会发生,直到我将方法包装在事务中.但是,我仍然发现这些变化并未持续存在.

关于可能发生的事情的任何想法将不胜感激!

@Override
public T merge(T object) {
    T rvalue = entityManager.merge(object);
    entityManager.flush();
    entityManager.refresh(rvalue);
    return rvalue;
}
Run Code Online (Sandbox Code Playgroud)

java spring hibernate jpa transactions

2
推荐指数
1
解决办法
9458
查看次数

标签 统计

java ×2

hibernate ×1

jackson ×1

jpa ×1

json ×1

polymorphism ×1

spring ×1

transactions ×1