Spring boot 如果不是表Spring Data JPA中的extist,则忽略列

Spring boot 如果不是表Spring Data JPA中的extist,则忽略列,spring-boot,spring-data-jpa,Spring Boot,Spring Data Jpa,我有一门课程,如下所示: @MappedSuperclass public abstract class BaseEntity { @Id Long id; String name; //getters and setters } 和两个实体扩展BaseEntity 头等舱 @Entity @Table(name= "table1") public class TValideB extends BaseEntity { @Column(name = "ph

我有一门课程,如下所示:

@MappedSuperclass
public  abstract class BaseEntity {

    @Id
    Long id;
    String name;

//getters and setters 
}
和两个实体扩展BaseEntity

头等舱

@Entity
@Table(name= "table1")
public class TValideB  extends BaseEntity {

 @Column(name = "phone")
 String phone;
}

二等舱

@Entity
@Table(name= "table2")
public class TValide extends BaseEntity {

    @Colmun(name = "mail")
    String mail;

}
当我试图保存TValide时,会出现如下错误
无效列“name”
; 在我的表2中,名称没有列

我的问题是如何忽略此列并保存实体? 存在其他方法而不从摘要中删除列名
上课

这应该可以解决您的问题。 在扩展
BaseEntity
的类中,对不需要的列执行此操作

@Entity
@AttributeOverride(name = "name", column = @Column(name = "name", insertable = false, updatable = false)
public class TValide extends BaseEntity {

    @Colmun(name = "mail")
    String mail;

}

如果必须使用基类,可以创建两个

@MappedSuperclass
public  abstract class BaseEntityWithId {

    @Id
    Long id;

//getters and setters 
}

@MappedSuperclass
public  abstract class BaseEntityWithName extends BaseEntityWithId {

  String name;    

//getters and setters 
}

然后,您只需根据表的列布局选择正确的选项。

更改您使用抽象的方式。创建一个扩展BaseEntity的新抽象类,该类包含很少使用的字段

例如:

@MappedSuperclass
public  abstract class BaseEntity {

   @Id
   Long id;

   //getters and setters 
}


@MappedSuperclass
public  abstract class BaseNameEntity extends BaseEntity {

   String name;

   //getters and setters 
}


@Entity
@Table(name= "table1")
public class TValideB  extends BaseNameEntity {

  @Column(name = "phone")
  String phone;

  //getters and setters 
}



@Entity
@Table(name= "table2")
public class TValide extends BaseEntity {

  @Column(name = "mail")
  String mail;

  //getters and setters 
}

通过这样做,您可以配置所有结构。

我只需在名称中添加
@Column
,insertable=false,updateable=false编辑我的抽象类,如下所示:

@MappedSuperclass
public  abstract class BaseEntity {

    @Id
    Long id;
    @Column(name = "name", insertable=false, updatable=false)
    String name;

//getters and setters 
}

这种方法避免了我创建大量抽象类或重写重写重写属性。

创建抽象基本实体的目的是让其他实体都可以扩展它,因此只在抽象类中提供绝对必要的字段。如果您需要一个实体中的名称而不需要其他实体中的名称,则通常不适合将其保留在BaseEntity中。@ROHAN。是的,但我搜索是否存在其他方法,并感谢这是好的。我是在建议。我已经发布了一个答案,让我知道它是否有用。想象一下,如果我在抽象类中有很多attibute,那么在每个实体中,我需要使用AttributeOverride是痛苦的:(是的,但这似乎是唯一的解决方案,也没有那么痛苦,因为您只需要在类中编写一次。正如我所说,如果您的BaseEntity实际上是一个抽象类,并且只有绝对必要的字段,那么您可能不需要经常这样做em,但我需要重写BaseEntity中已经存在的列:(为什么您需要重写BaseEntity中已经存在的列?要在我的实体中定义AttributeOverride,我首先采用了这种方法,但我有很多表和实体,所以如果我使用您的方法,我需要创建很多抽象类来满足need@A.khalifa最终,你必须停止忽视你正在采取的方法的信号ing是错误的。根据我的经验,拥有定义所有属性的平面实体,并使用Lombok最小化样板代码是唯一的方法。你甚至可以生成实体代码,大多数IDE都有插件或内置功能来实现。如果你做了那么一点前期工作,你未来的自己会感谢你突然需要对数据库进行更改,只需对一个实体进行一次小的更改即可。