每个子类的表与Spring Data的映射

时间:2018-06-02 17:59:34

标签: spring hibernate spring-boot spring-data-jpa

我正在使用Spring Data Jpa和注释为每个子类映射策略实现一个表,我怀疑是关于自动增量功能。

我有两个课程," Persona"和#34; Jugador"," Jugador"延伸自" Persona"。

我不知道Id的自动增量是否应该在父类,子类或两者中注释。

代码示例:

import React from 'react';
import style from '../style/AddButton.css';

const AddButton = () => {
  return (
    <div className={style.addButtonContainer}>
        &#43; Add Note
    </div>
  );
};


export default AddButton;

我怀疑的是,例如,如果我坚持一个&#34; Jugador&#34;并自动增加ID,以确保父表中相同的ID是相同的?如果我只对父类进行自动增量,那么子类如何检测到它以便为自己分配与父类相同的id,以便可以将它们连接起来?

我很担心这会在后台表现如何,请帮忙。

1 个答案:

答案 0 :(得分:0)

实体层次结构应该只定义一次它的标识符,所以你不应该像在你的情况下那样在根实体类和子类中这样做。

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Persona {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Integer id;
}

@Entity
public class Jugador extends Persona {
}

如果查看数据库表,您会注意到PersonaJugador的实体表都包含标识符列。

如果您发现需要在不同实体之间定义类似的列但需要不同的标识符逻辑,则映射的最佳方法是使用@MappedSuperclass

@MappedSuperclass
public abstract class AbstractBaseEntity<T> {
  // define common attribues here

  // define the identifier methods abstract
  // do not place any annotations on these methods here
  public abstract T getId();
  public abstract void setId(T id);
}

@Entity
public class EntityA extends AbstractBaseEntity<Integer> {
  // define EntityA attributes here

  // implement identifier getter/setter with annotations
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  public Integer getId() { return this.id; }
  public void setId(Integer id) { this.id = id; }
}

@Entity
public class EntityB extends AbstractBaseEntity<Long> {
  // define EntityB attributes here

  // implement identifier getter/setter with annotations
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE)
  public Long getId() { return this.id; }
  public void setId(Long id) { this.id = id; }
}

您也可以在此处应用@Inheritance,但您可以根据需要在EntityAEntityB上执行此操作,因为这些是两个不同实体层次结构的根实体一个共同的抽象界面归功于AbstractBaseEntity