как отобразить mysql вид при весенней загрузке? - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть приложение Spring Boot CRUD, которое работает, если я использую обычные MySQL таблицы. Но мне нужно отобразить данные из нескольких таблиц, поэтому я создал представление MySQL. Но теперь появляется следующая ошибка:

Ошибка создания компонента с именем entityManagerFactory, определенным в ресурсе пути к классу [org / springframework / boot / autoconfigure / orm / jpa / HibernateJpaConfiguration.class]: вызов init метод не удался; вложенное исключение: org.hibernate.AnnotationException: для сущности не указан идентификатор: net .tekknow.medaverter.domain.AppointmentView

Я следовал этому примеру: https://www.javabullets.com/calling-database-views-from-spring-data-jpa/

Вот объект домена:

package net.tekknow.medaverter.domain;

import java.io.Serializable;
import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.validation.constraints.Size;

@Entity
@Table(name = "vw_appointments")
public class AppointmentView implements Serializable {
    @Size(max = 32)
    @Column(name="Date")
    public String date;

    @Column(name="Physician")
    public String physician;

    @Column(name="LabCollected")
    public Timestamp labCollected;

    @Column(name="Note")
    public String note;

    public String getDate_time() {
        return date;
    }
    public String getPhysician() {
        return physician;
    }
    public Timestamp getDatetime_collected() {
        return labCollected;
    }
    public String getNote() {
        return note;
    }
}

Вот запрос mysql представления, просто чтобы показать вам, что он работает:

mysql> выберите * из vw_appointments; + ------------ + ------------- + --------------------- + ------------------- + | Дата | Врач | LabCollected | Примечание | + ------------ + ------------- + --------------------- + ------------------- + | 29.10.2010 | Кэмпбелл, J | 2010-10-29 11:09:00 | нет доступных заметок | + ------------ + ------------- + --------------------- + ------------------- + 1 строка в наборе (0.02 se c)

Вот код услуги:

@Service
@Transactional
public class AppointmentViewService {

    @Autowired
    AppointmentViewRepository repo;

    public List<AppointmentView> listAll() {
        return repo.findAll();
    }      
}

Вот код репозитория:

public interface AppointmentViewRepository extends JpaRepository<AppointmentView,Integer> {}

Разве Hibernate не обрабатывает представления? Предложения

1 Ответ

0 голосов
/ 29 апреля 2020

Все сказано в сообщении об ошибке:

Не указан идентификатор для сущности: net .tekknow.medaverter.domain.AppointmentView

Создайте представление так, чтобы он имеет 1 столбец, который можно сопоставить как поле идентификатора сущности с помощью аннотации @Id.

Вы также можете добавить аннотацию @org.hibernate.annotations.Immutable к вашей сущности, чтобы Hibernate не пытался распространять изменения, которые вы можете внести в вашу организацию

@Entity
@Table(name = "vw_appointments")
// Prevent changes from being applied by Hibernate
@org.hibernate.annotations.Immutable
public class AppointmentView implements Serializable {
    // Identifier. Has to be Integer as you implement JpaRepository<AppointmentView,Integer>
    @Id
    @Column(name="Appointment_Id")
    private Integer appointmentId;

    public Integer getAppointmentId() {
        return this.appointmentId;
    }

    public void setAppointmentId(Integer appointmentId) {
        this.appointmentId = appointmentId;
    }

    // Public attributes ???. 
    // If it is not mandatory for technical reasons, prefer private attributes + getter/setter
    @Size(max = 32)
    @Column(name="Date")
    public String date;

    @Column(name="Physician")
    public String physician;
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...