Fetch lazy Spring Data JPA

154
06 июля 2019, 02:10

Я имею класс Entity:

@Entity
@Table(name = "users")
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column(nullable = false, length = 100)
    @Pattern(regexp = "(.+)@(.+).(.+)", message = "Email address must contain @ and .")
    private String email;
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private Set<Knowledge> knowledge = new HashSet<>();
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private Set<Task> tasks = new HashSet<>();
    @Transient
    @NotBlank(message = "Name must be required")
    private String name;
    public User() {
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public Set<Knowledge> getKnowledge() {
        return knowledge;
    }
    public void setKnowledge(Set<Knowledge> knowledge) {
        this.knowledge = knowledge;
    }
    public Set<Task> getTasks() {
        return tasks;
    }
    public void setTasks(Set<Task> tasks) {
        this.tasks = tasks;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void addKnowledge(Knowledge knowledge) {
        this.knowledge.add(knowledge);
        knowledge.setUser(this);
    }
    public void removeKnowledge(Knowledge knowledge) {
        this.knowledge.remove(knowledge);
        knowledge.setUser(null);
    }
    public void addTask(Task task) {
        tasks.add(task);
        task.setUser(this);
    }
    public void removeTask(Task task) {
        tasks.remove(task);
        task.setUser(null);
    }
}

Так же имею репозиторий:

@Repository
public interface KnowledgeRepository extends CrudRepository<Knowledge, Integer> {
}

Предположим в нужном месте я достал entity по id, далее во время работы в некоторых местах мне нужны entity task(которые связаны с User), как я могу их достать в некоторых местах программы?

Answer 1

Если ваше поле помечено FetchType.LAZY, значит содержимое его вы можете получить только внутри одной транзакции для этого пометьте метод сервиса аннотацией @Transactional или сам класс, тогда каждый метод будет будет как отдельная транзакция. без этого при обращение к этому полю вы получите LazyInitializationException. или можно обратиться отдельно к репозиторию тасков и найти их по id юзера

Answer 2

А если определить в репозитории отдельный метод для получения юзера с тасками и когда нужны таски выдергивать юзера этим методом, к примеру как-то так:

@EntityGraph(attributePaths = "tasks")
@Query("SELECT u FROM User u WHERE u.id=?1")
User getWithTasks(int id);

P.S. Для валидации email есть аннотация @Email javax.validation.constraints.Email

READ ALSO
Почему не срабатывает break?

Почему не срабатывает break?

не имеет смыла, так как

131
Получить Request из PUT

Получить Request из PUT

Создаю метод PUT, делаю контроллер и пытаюсь откорректировать данные которые находятся в базе но на запрос PUT я получаю Bad Request, Required request body is missingПомогите...

140
Использование Stream в Map&#39;ах

Использование Stream в Map'ах

Помогите разобраться плиз

137
Чтение из файла BufferedReader

Чтение из файла BufferedReader

По сути у меня есть метод, который считывает слова из файла и записывает в массивПример текстового файла:

167