Java 映射一组枚举-Hibernate

Java 映射一组枚举-Hibernate,java,spring,hibernate,enums,set,Java,Spring,Hibernate,Enums,Set,有什么遗漏或错误 我正在尝试映射下面的类,它有一个枚举集。我完全按照文档中的方式,在其他主题或站点中这样做。但它没有起作用 创建新对象时,仅保存其他属性。该集合将被忽略 附言:它适合阅读 我正在使用SpringBoot、mysql和hibernate 枚举: 类别: import java.io.Serializable; import java.util.HashSet; import java.util.Set; import javax.persistence.*; import org.

有什么遗漏或错误

我正在尝试映射下面的类,它有一个枚举集。我完全按照文档中的方式,在其他主题或站点中这样做。但它没有起作用

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

附言:它适合阅读

我正在使用SpringBoot、mysql和hibernate

枚举:

类别:

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
}
测试:


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

我曾使用EntityManagerFactory或SessionFactory获取会话并执行操作,但在使用Spring Boot时,我遵循了以下“操作”指南,令人惊讶的是,它成功了:


总之,我停止了使用会话,停止了实现DAO,并让Spring为我处理它。

一切似乎都很完美。在调用entitymanager.persist(用户)之前,是否可以重新检查角色集是否确实具有某些内容?可能是出了什么问题。我已经编辑了我的问题,并包含了我用来测试的代码。我想知道是否与DDL上的ID和auto_increment子句有关
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
}
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);