Избегайте jpa fetch с помощью таблицы соединений - PullRequest
1 голос
/ 27 мая 2019

У меня есть следующие классы:

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

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


   @Id
   private int userId;

   private String fullName;

   private String ldapId;

   private String email;


   @ManyToOne
    @JoinColumn(name= "u_type", nullable=false)
    private Role uType;

    private String deleteFlag;

    private String typeAccess;

    @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;

   @OneToMany 
   @JoinTable(name="web_users_roles",
        joinColumns = {@JoinColumn(name="user_id")},
        inverseJoinColumns = {@JoinColumn(name="role_id")})
   private List<Section> sections = new ArrayList<Section>();


}

Служба:

@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);

    };
}

Как видите, у меня есть роль в пользователе и список ролей.Тот, который называется uType, будет чем-то вроде главной роли, а список - второстепенными ролями.Я знаю, что эта роль появится дважды, но меня это совершенно не волнует.

Мне бы хотелось, чтобы основная роль выбиралась с нетерпением, а список ролей - ленивым, по запросу, возможно ли это?

Таким образом, json будет выглядеть так:

{
    "user": {
        "userId": 1,
        "fullName": "Carolina Ponce",
        "ldapId": "f8cygqn",
        "email": "carolina@blabla.com",
        "uType": {
            "roleId": 1,
            "roleName": "Admin",
            "sections": [
                {
                    "sectionId": 2,
                    "sectionName": "Admin",
                    "components": []
                },
                {
                    "sectionId": 1,
                    "sectionName": "Dashboard",
                    "components": [
                        {
                            "componentId": 2,
                            "componentName": "Provincia",
                            "jsonArray": [
                                {
                                    "ID": "6",
                                    "NAME": "BUENOS AIRES"
                                }
                            ]
                        },
                        {
                            "componentId": 1,
                            "componentName": "Rubros",
                            "jsonArray": [
                                {
                                    "ID": "1",
                                    "NAME": "Automotriz"
                                },
                                {
                                    "ID": "31",
                                    "NAME": "Universidades"
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        "deleteFlag": "",
        "typeAccess": ""
    }
}

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

1 Ответ

1 голос
/ 27 мая 2019

Я не уверен, правильно ли я понимаю ваши вопросы, поскольку Jpa / Hibernate делает это по умолчанию.Все отношения * ToOne активны по умолчанию, в то время как все * ToMany по умолчанию ленивы.

Из документов @OneToMany.

public abstract FetchType fetch

    (Optional) Whether the association should be lazily loaded or must be eagerly
    fetched. The EAGER strategy is a requirement on the persistence provider runtime 
    that the associated entities must be eagerly fetched. The LAZY strategy is a 
    hint to the persistence provider runtime.

Default:
    javax.persistence.FetchType.LAZY

И из документов @ManyToOne

public abstract FetchType fetch

   (Optional) Whether the association should be lazily loaded or must be eagerly 
   fetched. The EAGER strategy is a requirement on the persistence provider runtime
   that the associated entity must be eagerly fetched. The LAZY strategy is a hint 
   to the persistence provider runtime.

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