Given:
{code:java}@Table(name = "users") @Entity public class UserEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") Integer id;
@NotNull @Column(name = "username") String username;
@ElementCollection @CollectionTable(name = "users_roles_mapping", joinColumns = @JoinColumn(name = "user_id")) @Column(name = "role_name") Set<String> roles; // ... }{code}
{code:sql} -- MSSQL 2022
CREATE TABLE users ( id INT NOT NULL IDENTITY, username VARCHAR(50) NOT NULL, CONSTRAINT pk_users PRIMARY KEY (id) );
CREATE TABLE roles ( name VARCHAR(50) NOT NULL, CONSTRAINT pk_roles PRIMARY KEY (name) );
CREATE TABLE users_roles_mapping ( user_id INT NOT NULL, role_name VARCHAR(50) NOT NULL, CONSTRAINT pk_users_roles_mapping PRIMARY KEY (user_id, role_name), CONSTRAINT fk_users_roles_mapping_user FOREIGN KEY (user_id) REFERENCES users (id), CONSTRAINT fk_users_roles_mapping_role FOREIGN KEY (role_name) REFERENCES roles (name) );
INSERT INTO users (username) VALUES ('user1'); INSERT INTO roles (name) VALUES ('role1'), ('role2'); INSERT INTO users_roles_mapping (user_id, role_name) VALUES (1, 'role1'), (1, 'role2');{code}
{code:java}public Set<String> getUserRoles() { EntityGraph<UserEntity> entityGraph = entityManager.createEntityGraph(UserEntity.class); entityGraph.addAttributeNodes("roles");
Query query = entityManager.createQuery("SELECT u FROM UserEntity u WHERE u.id = 1"); query.setMaxResults(1); query.setHint(EntityGraphType.FETCH.getKey(), entityGraph);
UserEntity userEntity = (UserEntity) query.getSingleResult(); return userEntity.getRoles(); }{code}
{{getUserRoles}} returns 2 roles in Hibernate {{5.6.15.Final}} and returns 1 role (which is wrong) in Hibernate {{6.1.7}}. |
|