我们遇到的基本问题是,当存在类型为基类的属性可以是多个子类中的任何一个时,如何处理 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 …
这是关于更新数据库中对象的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)