【问题标题】:Mapping a Set of Enum - Hibernate映射一组枚举 - Hibernate
【发布时间】:2018-05-30 00:14:17
【问题描述】:

有什么遗漏或错误?

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

创建新对象时,仅保存其他属性。 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
);

测试:

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

【问题讨论】:

  • 一切看起来都很完美。你能在调用 entitymanager.persist(user) 之前重新检查角色集是否真的有东西吗?可能有什么不对劲。
  • 我已经编辑了我的问题并包含了我用来测试的代码。
  • 我想知道是否与DDL上的ID和auto_increment子句有关

标签: java spring hibernate enums set


【解决方案1】:

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

我使用 EntityManagerFactory 或 SessionFactory 来获取会话并执行操作,但是当我使用 Spring Boot 时,我遵循了这个“操作方法”指南,令人惊讶的是,它起作用了:https://spring.io/guides/gs/accessing-data-jpa/

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 2019-11-23
    • 1970-01-01
    相关资源
    最近更新 更多