Spring Boot:防止在超类中声明的持久字段

Jak*_*sić 4 java hibernate jpa spring-boot

我正在 Spring Boot 中创建一个 Todo 应用程序,我需要创建两个表:TaskTodo( Todoextends Task)。

Task表中是一个名为的字段description,我想防止在Todo表中创建该列。

我该怎么做?

任务(父):

package com.example.todo.model;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Task {

    @Id
    private long id;
    private String name;
    private String description;
}
Run Code Online (Sandbox Code Playgroud)

待办事项(孩子):

package com.example.todo.model;

import javax.persistence.Entity;
import javax.persistence.Transient;

@Entity
public class Todo extends Task {

    private boolean isChecked;
}
Run Code Online (Sandbox Code Playgroud)

Smu*_*tje 5

我建议你清理你的设计,因为从其他具体类继承的具体类(通常)是一种代码气味。正确的解决方案是将两个类的公共部分分解为一个(抽象的)超类,然后将特定字段添加到具体的继承类中:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Completable {

    @Id
    private long id;
    private String name;
}
Run Code Online (Sandbox Code Playgroud)
@Entity
public class Task extends Completable {

    private String description;
}
Run Code Online (Sandbox Code Playgroud)
@Entity
public class Todo extends Completable {

    private boolean isChecked;
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以将行为分组在它所属的类中,并且不必确保某件事包含描述而它不应该包含描述。