首页 > 解决方案 > 映射一组枚举 - Hibernate

问题描述

有什么遗漏或错误?

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

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

PS:阅读效果很好。

我正在使用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
);

测试:

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

标签: javaspringhibernateenumsset

解决方案


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

我正在使用 EntityManagerFactory 或 SessionFactory 来获取 Session 并执行操作,但是当我使用 Spring Boot 时,我遵循了这个“如何做”指南,令人惊讶的是,它起作用了:https ://spring.io/guides/gs /访问数据-jpa/

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


推荐阅读