Лениво оценивать с весенними данными - PullRequest
0 голосов
/ 28 мая 2019

Я бы хотел, чтобы роли устанавливались лениво.Hibernate fetchType.Lazy не работает в тех случаях, когда используются данные Spring.Я пробовал много возможностей, таких как Entitygraph, но ни одна из них не работает на этом, или я использую их неправильно.У меня есть следующие классы:

Класс пользователя:

@Entity
@JsonRootName(value = "user")
@Table(name = "web_users", schema = "t_dw_comercial")
public class User {

   @Id
   private int userId;

   private String fullName;

    @OneToMany(fetch=FetchType.LAZY)
    @JoinTable(name="web_users_roles",
    joinColumns = {@JoinColumn(name="user_id")},
    inverseJoinColumns = {@JoinColumn(name="role_id")}
    )
    private List<Role> roles;

}

Роль класса:

    @Entity
    @JsonRootName(value = "roles")
    @Table(name = "web_roles", schema = "t_dw_comercial")
    public class Role {

       @Id
       private int roleId;

       private String roleName;

    }

Служба:

 @Service
    public class UserService implements IUserService{

        @Autowired
        UserRepository repository;

        public User findUserByLdapId(String loginName) {

            return repository.findUserByLdapId(loginName);
        }
    }

Репозиторий:

@Repository
public interface UserRepository extends CrudRepository<User, Long>{

    @Query("SELECT u FROM User u where u.ldapId= ?1")
public User findUserByLdapId(String loginName);


}

Контроллер:

@Controller
@RestController
public class UserController {

    @Autowired
    private IUserService userService;

    @CrossOrigin
    @RequestMapping(value = "/dashboard", params = {"user"}, method = RequestMethod.GET,  produces = "application/json")
    public ResponseEntity<User>  getUser(@RequestParam(value = "user") String ldapId) {

        User user =  userService.findUserByLdapId(ldapId);

        if(user == null)
            return new ResponseEntity<>(HttpStatus.NO_CONTENT);

        return new ResponseEntity<>(user, HttpStatus.OK);

    };
}

Так что json будет выглядеть так:

{
    "user": {
        "userId": 1,
        "fullName": "Carolina Ponce",
        "roles":[]
    }
}

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Прежде всего, Hibernate и Spring Data - это совершенно разные инструменты, предназначенные для разных целей, и они отлично работают друг с другом. Подробнее о различиях между ними можно прочитать здесь: В чем разница между JPA Hibernate и Spring Data?

Spring Data не имеет ничего общего с тем, как вы выбираете связанные коллекции сущностей, как это делает реализация Hibernate, как реализация JPA.

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

Я предлагаю вам создать некоторый объект DTO, который вы могли бы вернуть с вашего контроллера, а не возвращать сущность. Кажется, вы не хотите раскрывать роли пользователя, поэтому создание DTO без ролей может быть хорошей идеей. Другое решение состоит в том, чтобы поручить Джексону пропустить свойство roles во время сериализации с использованием аннотации @JsonIgnore.

0 голосов
/ 28 мая 2019

Кажется, вы спрашиваете о двух разных вещах: как лениво получить @OneToMany ассоциацию (что должно работать из коробки) и как сделать ваш JSON похожим на вышеприведенный (который не имеет ничего общего с тем, какJPA выборка объекта настроена).

Если вы сериализуете свою сущность, используя Джексона, по умолчанию все поля будут сериализованы, включая те, которые выбираются лениво.Если контекст постоянства все еще открыт, когда вы начинаете сериализовать объекты, Джексон просто запустит отложенную загрузку, получив доступ к свойству.В результате, независимо от того, используете ли вы FetchType.EAGER или FetchType.LAZY, roles будет включено в результат (я предполагаю, что это так, поскольку вы получите LazyInitializationExceptionесли контекст был закрыт).

Решение состоит в том, чтобы просто попросить Джексона воздержаться от сериализации roles с использованием @JsonIgnore, если вы не хотите, чтобы свойство было получено в результате.

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