Весной отношения сущности Один ко Многим не приводят к получению данных. - PullRequest
1 голос
/ 21 сентября 2019

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

Пользователь

@Data
@NoArgsConstructor
@Entity
@EqualsAndHashCode
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;     
    private String name;    
    @OneToMany(mappedBy = "user")
    private List<Skill> skills;

}

Skill

@Data
@NoArgsConstructor
@Entity
@EqualsAndHashCode
public class Skill {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;        
    private String skillTitle;      
    @ManyToOne
    @JoinColumn(name="user_id")
    private User user;

}

UserRepository

@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
    List<User> findByName(@Param("name") String name);
}

SkillRepository

@RepositoryRestResource(collectionResourceRel = "skills", path = "skills")
public interface SkillRepository extends CrudRepository<Skill, Long>{

}

со всем выше, я могу получить ответ, например, по URL http://localhost:8085/users/1

{
    "name": "Root",
    "_links": {
        "self": {
            "href": "http://localhost:8085/users/1"
        },
        "user": {
            "href": "http://localhost:8085/users/1"
        },
        "skills": {
            "href": "http://localhost:8085/users/1/skills"
        }
    }
}

не проблема в том, что я не понимаю, почему список навыков не выбирается, почему только этот список

"skills": {
   "href": "http://localhost:8085/users/1/skills"
}

не полный список связанных навыковдо user/1.

ОБНОВЛЕНИЕ

Добавлена ​​проекция в соответствии с предложением: UserProjection.java

@Projection(name = "inlineData", types=User.class)
public interface UserProjection {
    String getName();
    List<Skill> getSkills();
}

UserRepository.java is

@RepositoryRestResource(collectionResourceRel = "users", path = "users", excerptProjection = UserProjection.class)
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
    List<User> findByName(@Param("name") String name);
}

ответ:

{
    "name": "Root",
    "_links": {
        "self": {
            "href": "http://localhost:8085/users/1"
        },
        "user": {
            "href": "http://localhost:8085/users/1{?projection}",
            "templated": true
        },
        "skills": {
            "href": "http://localhost:8085/users/1/skills"
        }
    }
}

1 Ответ

0 голосов
/ 21 сентября 2019

Ответ правильный, работает как задумано.@RepositoryRestResource следует HATEOAS принципам. Пружинная документация объясняет это следующим образом:

5.1.3.Обнаружение ресурсов

Основной принцип HATEOAS заключается в том, что ресурсы должны обнаруживаться путем публикации ссылок, указывающих на доступные ресурсы ...

Отправляя запрос на корневой URL-адрес ...клиент может извлечь из возвращенного объекта JSON набор ссылок, которые представляют следующий уровень ресурсов, доступных для клиента ...

Вы получаете ссылки, которые представляют ресурсы.Чтобы получить определенные ресурсы, вы должны позвонить по соответствующему URL.Ваш ответ для пользователя 1 означает, что если вы хотите получить навыки пользователя 1, вам следует позвонить по URL-адресу "http://localhost:8085/users/1/skills".

. Это легче понять, если вы представите, что у вас есть HTML-страница, отображающая свойства пользователя.1. Эта страница напрямую не отображает Навыки, вместо этого она содержит ссылку на страницу Навыков. Только если пользователь щелкнет по этой ссылке, будет загружена страница Навыков.

Важно, чтобы вы понимали HATEOAS хорошо.

Конечно, могут быть случаи, когда HATEOAS - не лучший выбор. Но здесь мы не обсуждаем HATEOAS, а объясняем, в чем суть этой реализации Spring. Такой подход может действительнобыть полезным во многих случаях. Когда у вас есть 2 сущности с 1-2 атрибутами, вы можете считать такой подход избыточным. Но если у вас есть 30-50 сущностей, каждая из которых имеет 3-5 связей, каждая из которых содержит 50-100 других сущностей,может быть довольно сложно иметь дело с такой моделью данных. И HATEOAS может сделать это намного проще. С этим подходомh вы просто перемещаетесь по по этим отношениям: загрузите один объект, выберите необходимое отношение, загрузите объекты по этому отношению, выберите нужный объект, в этом объекте выберите необходимое отношение, загрузите это отношение или вернитесь к его родительскому объектучерез родительские отношения и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...