【发布时间】: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