java - 如何在 Spring Boot 中扩展类而不更改 MySQL 架构?

标签 java mysql hibernate spring-boot

例如,我有 User 类,如下所示:

    @Entity
    @Table(name = "users")
    public class User{
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id")
        private Long id;

        @NotBlank
        @Size(max = 40)
        @Column(name = "name")
        private String name;

        @NotBlank
        @Size(max = 15)
        @Column(name = "username")
        private String username;

        @NaturalId
        @NotBlank
        @Size(max = 40)
        @Email
        @Column(name = "email")
        private String email;

        @NotBlank
        @Size(max = 100)
        @Column(name = "password")
        private String password;

        @ManyToMany(fetch = FetchType.LAZY)
        @JoinTable(name = "user_roles",
                joinColumns = @JoinColumn(name = "user_id"),
                inverseJoinColumns = @JoinColumn(name = "role_id"))
        private Set<Role> roles = new HashSet<>();

//Constructor
//Getters and Setters

我有 Client 类:

@Entity
@Table(name = "cliente")
public class Cliente {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @Column(name = "empresa")
    private String empresa;
    @Column(name = "telefono")
    private Integer telefono;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(unique = true)
    private Licencia licencia;

    @OneToMany(cascade = {
            CascadeType.PERSIST,
            CascadeType.REMOVE
    } ,fetch = FetchType.EAGER)
    @JoinTable(name = "user_cliente",
            joinColumns = @JoinColumn(name = "cliente_id"),
            inverseJoinColumns = @JoinColumn(name = "user_id"))
    private Set<User> users = new HashSet<>();

    public Cliente(String empresa, Integer telefono) {
        this.empresa = empresa;
        this.telefono = telefono;
    }

//Constructor
//Getters and Setters

现在,我想要做的是 Client 类来扩展 User 类,这样我就可以添加一个包含名称、用户名、电子邮件等的 Client。但是我想要在 MySQL 中创建两个单独的表,一个用于用户及其表属性,以及其他仅针对客户的信息,例如电话或公司。问题是当我在 Client 类中扩展 User 类时,MySQL 数据库会更新并在 User 表中创建电话、公司等字段。我怎样才能避免这种情况?

最佳答案

使用@MappedSuperclass:

@MappedSuperclass
public class BaseEntity {
    // here you can add common fields for your entities
}

然后从中扩展:

@Entity
public class User extends BaseEntity {
    // user specific fields goes here
}

客户端:

@Entity
@Table(name = "cliente")
public class Cliente extends BaseEntity {
    // client specific fields here
}

有关更多信息,请阅读 How to inherit properties from a base class entity using @MappedSuperclass with JPA and Hibernate

关于java - 如何在 Spring Boot 中扩展类而不更改 MySQL 架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58399631/

相关文章:

java - 通过套接字传输字节数组

java - Thrift 服务与 RESTful 服务哪个更好?

java - SearchAPI 和 Hibernate 子树意外结束

mysql - Codeigniter 连接多个表并求和

database - 更改hibernate关系映射(从单向到双向)

java - 在 Spring Data JPA 中连接两个表并从存储库查询两个表数据

java - 以下技术获取 RequestContext 是否正确

java - 在 Spring Boot 中配置 0-legged OAuth 1.0

php - UTF8 与 Latin1

php - HTML 和 PHP 在一个文件中