java - Spring Boot Hibernate 创建名称错误的表
问题描述
当我运行我的项目时,Hibernate 会自动创建名称错误的表。我有两个表 User 和 Role 以及三个类:抽象类 IdField.java:
@Entity
public abstract class IdField {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
//constructors and getters setters
用户.java 类:
@Entity
@Table(name = "user", schema = "quiz_app")
public class User extends IdField{
@Column(name = "user_name")
private String userName;
@Column(name = "password")
private String password;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "email")
private String email;
@ManyToMany(fetch = FetchType.EAGER)
private Collection<Role> roles = new ArrayList<>();
//constructors and getters setters
和 Role.java 类:
@Entity
@Table(name = "role", schema = "quiz_app")
public class Role extends IdField{
@Enumerated(EnumType.ORDINAL)
@Column(name = "role_name")
private RoleName roleName;
//constructors and getters setters
Hibernate 创建了两个名称错误的表,分别为 id_field 和 id_field_roles:
但我想要像“user”和“role”这样的@Table注释中的表名
解决方案
熟悉继承策略:
https://thorben-janssen.com/complete-guide-inheritance-strategies-jpa-hibernate/
在我看来,您正在寻找@MappedSuperclass
如果您只想在实体之间共享状态和映射信息,映射超类策略非常适合且易于实现。您只需设置继承结构,注释所有属性的映射信息并将@MappedSuperclass 注释添加到您的超类。如果没有@MappedSuperclass 注解,Hibernate 将忽略你的超类的映射信息。
最重要的是:如果您的共享部分只是 id 字段,顾名思义,继承看起来有点矫枉过正。
推荐阅读
- angular - 如何以角度8显示文件
- php - yii2 身份会话到期
- javascript - 使用 JavaScript 将带有数组的 JSON 文件上传到不同的选项卡
- iptables - 怎么办:iptables 丢弃碎片?
- apache-flink - Flink MapState 在 TTL 清理期间清理映射键的整个值
- javascript - 在 Esri 地图上放置图钉后如何停止自动保存页面?
- android - 具有新技术和动画的 Android 主题启动器活动(启动画面)
- javascript - 如何在 VueCLI 3 中全局获取 `webpack.config.js` 或 `vue.config.js` 文件数据
- azure-powershell - 尝试在 azure 中获取应用程序配置
- django - 在 Django 模型中定义 FileField upload_to 目录