gpt4 book ai didi

java - 映射一组枚举 - Hibernate

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:02 25 4
gpt4 key购买 nike

缺少什么或错了什么?

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

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

数据链接:

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

最佳答案

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

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

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

关于java - 映射一组枚举 - Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50594683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com