映射一组枚举 - Hibernate

时间:2018-05-30 00:14:18

标签: java spring hibernate enums set

缺少什么或错了什么?

我正在尝试映射下面的类,它有一个Enum Set。我完全按照文档,其他主题或网站的方式进行操作。但它没有用。

创建新对象时,仅保存其他属性。该组被忽略。

P.S。:它适用于阅读。

我正在使用spring-boot,mysql,hibernate。

枚举:

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

TEST:

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 :(得分:0)

通过改变我使用Hibernate的方式,我能够解决问题。

我正在使用EntityManagerFactory或SessionFactory来获取会话并执行操作,但是当我使用Spring Boot时,我遵循了这个&#39;如何&#39;引导,并且,它起作用了:https://spring.io/guides/gs/accessing-data-jpa/

总之,我停止使用Session,停止实现DAO,让Spring为我处理它。

相关问题