Изменение поля сущностей на другое поле - PullRequest
1 голос
/ 09 июля 2019

В принципе, скажем, у меня есть класс - Автомобиль.В этом классе автомобилей есть поле «пользователь».Сейчас есть разные типы пользователей - скажем, «продавец», «водитель такси», «экзаменатор».Все это сами по себе классы, которые в конечном итоге будут иметь разные поля.Теперь допустим, что машина продана, и владелец должен поменяться.Теперь возникает проблема - чтобы сменить владельца, поле «владелец» в классе пользователя должно быть чем-то общим - оно не может быть «продавцом», потому что, как бы я затем сменил владельца на «водитель такси».Я слышал о терминах полиморфный дБ и морфинг вокруг этой темы, но, честно говоря, я понятия не имею, как решить эту проблему.

Я посмотрел руководство и то, что он предложил, сработало в какой-то момент.Он создал абстрактный класс «владелец» и создал классы «экзаменатор», «продавец», «водитель такси», которые расширяют абстрактный класс.Абстрактный класс использует наследование с single_table, и в этом случае создается одна таблица, в которой хранятся все классы, расширяющие владельца, и их можно отличить друг от друга по столбцу «тип».Сохранение сущностей через jpa прекрасно работало с этим решением, но когда я хочу найти владельца по его идентификатору, это не сработало, возможно, потому, что мой JpaRepository пытается сопоставить строку БД с классом Owner, но так как Owner является абстрактным классом,он не может создать его экземпляр.

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = 
DiscriminatorType.STRING)
public abstract class Owner {
    @Id
    @GeneratedValue
    private Long id;
}


@Entity
@Data
@DiscriminatorValue("salesman")
public class Salesman extends Owner {
    @Id
    @GeneratedValue
    private Long id;

    private Long balance;
}


@Repository
public interface OwnerRepository extends JpaRepository<Owner, Long> {
}


@Service
public class OwnerService {

    @Autowired
    private OwnerRepository repo;

    public Owner getById(Long id) {
        return repo.getOne(id);
    }
}

Я ожидаю, что смогу изменить пользователей автомобиля и выполнять с ними простые операции CRUD.

В настоящее время я получаю следующееошибка при попытке использовать метод JpaRepository getOne (): Servlet.service () для сервлета [dispatcherServlet] в контексте с путем [] вызвала исключение [Ошибка обработки запроса;вложенным исключением является org.springframework.http.converter.HttpMessageConversionException: ошибка определения типа: [простой тип, класс org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor];вложенным исключением является com.fasterxml.jackson.databind.exc.InvalidDefinitionException: не найден сериализатор для класса org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor, и не обнаружено никаких свойств для создания BeanSerializer (чтобы избежать исключения, отключите SerializationFeature.FAIL_ONEANSTYE) (цепочка ссылок: ee.priit.polymorphism.model.Owner $ HibernateProxy $ GnSnpo6f ["hibernateLazyInitializer"])] с коренной причиной

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: не найден сериализатор для класса или.hibernate.) * +1010 *

1 Ответ

0 голосов
/ 09 июля 2019

Вы можете создать репозиторий jpa с параметризацией

public interface OwnerRepository extends JpaRepository<Owner, Long>

find() вернет тип Salseman, стертый до типа Owner.Если вы создадите еще один класс, который расширяет Owner, пусть скажет Examiner, когда вы позвоните findAll jpa вернет вам список Owner и Examiner, смешанных вместе и стертых в родительский тип Owner.По крайней мере, это последняя версия jpa + hibernate.

Во время извлечения данных jpa (hibernate) определяет тип целевого объекта на основе значения столбца Discriminator и соответственно создает тип целевого объекта.

Если вы хотите извлечьвсе Owner, но только Owner, то есть Salesman параметризация, такая как

public interface OwnerRepository extends JpaRepository<Salesman, Long>

, добьется цели.

Если вы попытаетесь включить

spring:
  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true

... Hibernate SQL выход, вы найдете точный выбор структуры запроса.(Поскольку вы спрашиваете jpa, я предполагаю, что вы используете пружинный или пружинный ботинок).

...