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