Java Spring ManyToOne, как загрузить только ссылку - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть данные, хранящиеся в Spring сотрудников и «планы личного развития». Сотрудник является доминирующим классом, так сказать. Это выглядит так:

@Entity(name = "employee")
@Table(name = "EMPLOYEE")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "EMPLOYEE_ID")
    private int id;

    // etc...
}

Персональный план развития выглядит следующим образом:

@Entity(name = "pdp")
@Table(name = "PDP")
public class PersonalDevelopmentPlan implements Serializable {

    @Id
    @GeneratedValue
    @Column(name = "PDP_ID")
    private int id;

    @ManyToOne(optional = false)
    @JoinColumn(name = "EMPLOYEE_ID")
    private Employee employee;

    // etc..
}

В базе данных он хранится в виде ссылки на внешний ключ из PDP -> Employee.

Я хочу иметь возможность загружать PDP, как он есть в базе данных, только с идентификатором сотрудника, но я всегда получаю весь объект Employee со всеми атрибутами. Как мне это сделать?

Я пытался @ManyToOne(fetch = FetchType.Lazy), но при загрузке я получаю следующую ошибку:

Ошибка определения типа: [простой тип, класс org.hibernate.proxy .pojo.bytebuddy.ByteBuddyInterceptor]; вложенное исключение - com.faster xml .jackson.databind.ex c .InvalidDefinitionException: не найден сериализатор для класса org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor и не обнаружены свойства для создания BeanSerializer (чтобы избежать исключения, отключите SerializationFeature.FAIL_ON_EMPTY_BEANS) (через цепочку ссылок: java .util.ArrayList [0] -> nl.kars.lms.model.pdp.PersonalDevelopmentPlan ["employee"] -> nl.kars.lms.model.Employee $ HibernateProxy $ $ AAwzPX4I ["hibernateLazyInitializer"])

Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 21 апреля 2020

Это на самом деле, как работает ORM ... отображение таблицы (реляционная сторона) на сущности (сторона объекта). И сопоставление между сущностями осуществляется не через идентификаторы, а по ссылкам на сущности. Так что либо просто сохраните идентификатор (так что удалите сильную связь), либо используйте проекционный запрос, чтобы просто вернуть идентификатор сотрудника.

1 голос
/ 21 апреля 2020

Если вам нужен только идентификатор, почему бы не отобразить его без связи?

@Entity(name = "pdp")
@Table(name = "PDP")
public class PersonalDevelopmentPlan implements Serializable {

    @Id
    @GeneratedValue
    @Column(name = "PDP_ID")
    private int id;

    @Column(name = "EMPLOYEE_ID")
    private Long employeeId;

    // etc..
}
0 голосов
/ 22 апреля 2020

Вы можете создать геттер:

public Long getEmployeeId(){
 return this.employee.getId();
}

Или вы можете изменить отображение на значение private Long employeeId.

...