com.sun.jdi.invocationexception для метода getOne (id) Hibernate Spring MVC репозиторий JPA

#java #mysql #hibernate #spring-mvc #jpa

#java #mysql #спящий режим #spring-mvc #jpa

Вопрос:

Я делаю проект Spring MVC и застрял в этой проблеме.

У меня есть объект «TipoDoc», его собственный сервис и репозиторий, использующий репозиторий JPA, в моем сервисе у меня есть метод GetAll(), который вызывает метод findAll() репозитория JPA, и он работает нормально, но когда я хочу использовать метод для получения его по идентификатору, я получаю нулевой объекткакой бы идентификатор я ни отправлял методу.

Итак, я начал отлаживать поиск проблемы и обнаружил com.sun.jdi.invocationexception в ответ, когда Hibernate должен выполнить метод getOne() из репозитория JPA.

Я не знаю, что не так в моем коде, или как я могу получить более подробную информацию из исключения.. Я использую log4j для входа в систему, но я не знаю, как перехватить это исключение в журнале..

Я использую базу данных MySQL

Вот мой код

 @Entity
@Table(name = "TiposDocumento")
public class TipoDoc 
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idTipoDocumento")
    private long id;
    
    private String descripcion;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }
}
  

Служба

 @Service
public class TipoDocService {
    
    private final TipoDocRepo tipoDocRepo;

    @Autowired
    public TipoDocService(TipoDocRepo tipoDocRepo) {
        this.tipoDocRepo = tipoDocRepo;
    }

    public List<TipoDoc> getAll() {
        return (List<TipoDoc>)tipoDocRepo.findAll();
    }
    
    public TipoDoc getById(Long id) {
        return (TipoDoc) tipoDocRepo.getOne(id);
    }
}
  

Репозиторий

 public interface TipoDocRepo extends JpaRepository<TipoDoc, Long>{
}
  

Контроллер

 @Controller
public class ClientController
{
    private static final Logger logger = Logger.getLogger(ClientController.class);
    private final ClienteService clienteService;
    private final TipoDocService tipoDocService;
    private final EstadoCivilService estadoCivilService;
    private final ProvinciaService provinciaService;
    private final LocalidadService localidadService;
    private final CondIvaService condIvaService;
    
    
    @Autowired
    public ClientController(ClienteService clienteService, TipoDocService tipoDocService, EstadoCivilService estadoCivilService,
            ProvinciaService provinciaService, LocalidadService localidadService, CondIvaService condIvaService) {
        this.clienteService = clienteService;
        this.tipoDocService = tipoDocService;
        this.estadoCivilService = estadoCivilService;
        this.provinciaService = provinciaService;
        this.localidadService = localidadService;
        this.condIvaService = condIvaService;
        
    }

    @RequestMapping("/Clientes")
    public ModelAndView formularioCliente()
    {   
        ModelAndView mav = new ModelAndView("clientes");
        mav.getModel().put("cliente",new Cliente());
        mav.getModel().put("tiposDoc", tipoDocService.getAll()); //Works fine, tiposDoc={{1,DNI};{2,Passaport};{3,LC}}
        TipoDoc tipoDoc = tipoDocService.getById((long) 1); //not working tipoDoc={0,null} when it have to be {1,DNI}
        mav.getModel().put("estadosCiviles", estadoCivilService.getAll());
        mav.getModel().put("provincias", provinciaService.getAll());
        mav.getModel().put("localidades", localidadService.getAll());
        mav.getModel().put("condicionesIva", condIvaService.getAll());
        return mav;
    }
  

persistence.xml

 <?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
  version="2.1">
  
  <persistence-unit name="OFYS">
    <properties>
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
        <property name="javax.persistence.jdbc.user" value="root" />
        <property name="javax.persistence.jdbc.password" value="admin" />
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/OFYS" />
    
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
    </properties>
  </persistence-unit>
  
</persistence>
  

И это то, что я могу найти для отладки

Редактировать. Вот полное описание исключения, которое я могу получить, если вы не видите изображение

com.sun.jdi.invocationexception: исключение, возникшее в целевой виртуальной машине, вызвало метод вызова.

Ответ №1:

Объект не существует в базе данных с заданным идентификатором. По-видимому, у вас есть прокси-сервер этого объекта в вашем контексте сохранения, который возвращается здесь . При доступе к объекту он пытается фактически загрузить его из базы данных и терпит неудачу, потому что нет строки с этим идентификатором.

Комментарии:

1. Да, он существует. Если вы видите в возврате метода GetAll(), у меня есть объект с Id = 1 и description= DNI, но когда я хочу получить доступ только к этому объекту, отправляя ID = 1 методу GetById(), я получаю идентификатор объекта = 0, description = null

2. Покажите мне содержимое объекта-перехватчика.

3. Ну, я уже нашел решение, вместо этого используя метод getOne () из интерфейса JpaRepository, теперь я использую метод findOne () из интерфейса CrudRepository, и он работает, я думаю, что это была проблема с созданием прокси-сервера Hibernate или что-то в этом роде..