当前位置: 首页 > 知识库问答 >
问题:

ErrorClassException:对象[id=null]不属于指定的子类

季嘉良
2023-03-14

我有一个像下面这样的模型:

@Entity(name = "request")
public class VisitRequest {
  @Id
  @GeneratedValue
  private Long id;

  @OneToMany(mappedBy = "visitRequest", cascade = CascadeType.ALL, orphanRemoval = true)
  @JsonManagedReference
  private List<Visitor> visitors;

  //default constructor, getters and setters
}

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "class")
public class Visitor {
  @Id
  @GeneratedValue
  private Long id;

  @ManyToOne
  @JsonBackReference
  private VisitRequest visitRequest;

  //default constructor, getters and setters

}

@Entity
public class ContactPerson extends Visitor {

  private PhoneNumber phoneNumber;

  //default constructor, getters and setters

}

但是当我尝试通过将其中一个访问者与一个联系人交换来更新一个visitRequest,并尝试在一个CRUD存储库visit request repository . save(visit request)上执行该方法时;我得到了这个异常:

Servlet。路径为[]的上下文中servlet[dispatcherServlet]的service()引发了异常[Request processing failed;嵌套异常为org.springframework.orm.ObjectRetrievalFailureException:对象[id=null]不属于指定的子类[cern.ais.visions.core.domain.visitor.visitor]:给定对象的类与持久副本的类不匹配;嵌套的异常是org.hibernate。ErrorClassException:对象[id=null]不属于指定的子类[cern.ais.visions.core.domain.visitor.visitors]:给定对象的类与具有根本原因的持久副本的类不匹配

也许问题在于数据库中的contact_person和visitor表使用了相同的id?

我该如何解决这个问题?我一直在寻找解决方案,但没有一个对我有效。

共有3个答案

澹台硕
2023-03-14
@Entity(name = "request")
public class VisitRequest {
  @Id
  @GeneratedValue
  private Long id;

  @OneToMany(mappedBy = "visitRequest", cascade = CascadeType.ALL, orphanRemoval = true)
  @JsonManagedReference
  private List<Visitor> visitors;

  //default constructor, getters and setters
}

@Entity(name = "visitor")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "visitor_type", discriminatorType = DiscriminatorType.STRING, length = 16)
@DiscriminatorValue(value = "visitor")
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "class")
public class Visitor {
  @Id
  @GeneratedValue
  private Long id;

  @ManyToOne
  @JsonBackReference
  private VisitRequest visitRequest;

  //default constructor, getters and setters

}

@Entity(name = "contact_person")
@Table(name = "contact_person")
@DiscriminatorValue(value = "contact_person")
public class ContactPerson extends Visitor {

  private PhoneNumber phoneNumber;

  //default constructor, getters and setters

}

你可以像contactPersonDao.save一样坚持联系人(contactPerson),你不能坚持带有访问者链接的字段。我不是专家,但它对我有用。如果访问者不联系人,你可以将他作为访问者坚持下去

吴子昂
2023-03-14

我怀疑您遇到这个问题的原因是您的注释< code>@Id和@GeneratedValue没有被继承。如果您在ContactPerson中定义属性id,您将拥有一个生成的Id,这将不再是一个问题。

尝试将ContactPerson类更改为:

@Entity
public class ContactPerson extends Visitor {

  @Id
  @GeneratedValue
  private Long id;

  private PhoneNumber phoneNumber;    
  //default constructor, getters and setters

}
龚威
2023-03-14

您可能没有在 ContactPerson 中初始化 visitRequest 引用。请看一下下面的配置,它适用于Spring Boot JPA。我使用龙目岛生成了 GetterSetter。

这里有一个在Spring Boot实现的工作示例https://github . com/conscious observer/SpringBootJpaInheritance

@Data
@Entity(name = "request")
class VisitRequest {
    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(mappedBy = "visitRequest", cascade = CascadeType.ALL, orphanRemoval = true)
    @JsonManagedReference
    private List<Visitor> visitors = new ArrayList<>();
}

@NoArgsConstructor
@Data
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "class")
class Visitor {
    @Id
    @GeneratedValue
    private Long id;

    @ManyToOne
    @JsonBackReference
    private VisitRequest visitRequest;

    public Visitor(VisitRequest visitRequest) {
        this.visitRequest = visitRequest;
    }
}

@NoArgsConstructor
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@Entity
class ContactPerson extends Visitor {
    private String phoneNumber;

    public ContactPerson(VisitRequest visitRequest, String phoneNumber) {
        super(visitRequest);
        this.phoneNumber = phoneNumber;
    }
}
 类似资料:
  • 我已经开始使用PowerShell来完成一些事情,并在PowerShell中使用变量。 我遇到的问题是,当我将变量分配给类中定义的变量时,测试返回而不是。 示例代码: 现在,对未定义变量< code>$test2的测试返回< code>true,因为PowerShell中的每个未定义变量都被赋予了< code>$null。 但是,如果我测试我分配给的对象的属性,则会测试的 是不是因为在PowerS

  • 问题内容: 我尝试过一些关于绑定和未绑定方法的代码。当我们调用它们时,我认为它们都会返回对象。但是,当我用于获取一些信息时,它返回的内容我并不理解。 IDE:Eclipse 插件:pydev 输出是… 为什么#1和#2返回相同的ID?他们不是不同的对象吗?如果我们分配和两个变量,#3,#4回报不同的ID。 我认为#3和#4表明它们不是同一对象,而是#1和#2 … 绑定方法的ID和未绑定方法的ID有

  • 当一个空的时候,问题就出现了。(因为我们只是在查阅表本身,而不考虑外键) 当我使用pathurl/pedidos/5时,我会得到以下错误 这是由于OrderId对象的参数“customer_code”(FK另一个表)达到null。 将变量numero_pedidode从Pedidos类重命名为numeroPedido

  • 问题内容: 我相信我犯了一个非常简单的错误/忽略了一些琐碎的事情。 编译时收到以下错误。 为什么我无法访问 Integer* 类中的 intValue() 方法? * 问题答案: 您正在使用决定命名的类型参数变量来遮盖该类型。 您的代码等同于 显然不会编译,因为(的边界)没有声明方法。 你想要的是 在这种情况下,用作类型参数。

  • 我有以下JPQL查询: 这应该返回所有对具有NULL的。 但是,我正在运行代码并进行调试,我看到返回的集合包含此字段为null的实体。 这是JPQL中的错误吗?

  • 问题内容: 我正在实现RESTful Web服务,其中用户必须与请求一起发送签名的验证令牌,以便可以确保请求不会被中间人篡改。我当前的实现如下。 验证令牌是一个VerifData对象,它序列化为String,然后进行哈希处理和加密。 在我的服务中,我将要序列化的数据放入VerifData的实例中,然后使用Jackson ObjectMapper对其进行序列化,并与验证令牌一起传递给验证引擎。 但是