Составление карт набора Enum - Hibernate - PullRequest
0 голосов
/ 30 мая 2018

Чего не хватает или нет?

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

При создании нового объекта сохраняются только остальные атрибуты.Набор игнорируется.

PS: он отлично работает для чтения.

Я использую spring-boot, mysql, hibernate.

Enum:

public enum Role {
    ROLE_A,
    ROLE_B,
    ROLE_N;
}

Класс:

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.*;
import org.hibernate.annotations.NaturalId;

@Entity
@Table(name = "Users")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 50, unique = true)
    @NaturalId
    private String username;

    @Column(nullable = false, length = 100)
    private String password;

    @Column(nullable = false)
    private boolean active = true;

    @Column(nullable = false, length = 50)
    private String name;

    @Column(nullable = false, length = 100)
    private String lastname;

    @Column(nullable = false, length = 100, unique = true)
    private String email;

    @ElementCollection(targetClass = Role.class)
    @CollectionTable(name = "roles", joinColumns = @JoinColumn(name = "id_user"))
    @Enumerated(EnumType.STRING)
    @Column(name = "role")
    private Set<Role> roles = new HashSet<>();

// constructor
// gets & setters
// hashCode & equals
// toString
}

DDL:

CREATE TABLE Users (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  username VARCHAR(50) NOT NULL,
  password VARCHAR(100) NOT NULL,
  active BOOL NOT NULL DEFAULT true,
  name VARCHAR(50) NOT NULL,
  lastname VARCHAR(100) NOT NULL,
  email VARCHAR(100) NOT NULL,
  PRIMARY KEY(id),
  UNIQUE INDEX unique_username(username),
  UNIQUE INDEX unique_email(email)
);

CREATE TABLE Roles (
  id_user BIGINT UNSIGNED NOT NULL,
  role VARCHAR(50) NOT NULL,
  PRIMARY KEY(id_user, role),
  FOREIGN KEY(id_user)
    REFERENCES Users(id)
      ON DELETE CASCADE
      ON UPDATE CASCADE
);

ТЕСТ:

User u = new User();
u.setName("nikolas");
u.setLastname("Martins");
u.setEmail("nik@outlook.com");
u.setUsername("nik");
u.setPassword("password");
u.getRoles().add(Role.ROLE_A);
u.getRoles().add(Role.ROLE_B);
entityManager.save(u);

1 Ответ

0 голосов
/ 31 мая 2018

Мне удалось решить эту проблему, изменив способ работы с Hibernate.

Я использовал EntityManagerFactory или SessionFactory для получения сеанса и выполнения операций, однако, поскольку я использую Spring Boot Iследовал этому руководству «Как сделать» и, к удивлению, это сработало: https://spring.io/guides/gs/accessing-data-jpa/

Таким образом, я перестал использовать Session, прекратил реализацию DAO и позволил Spring обработать его для меня.

...