我遇到此错误:

sesion.org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: entities.Elaborado.componentes[entities.Producto]


这是超类:

package entities;

import javax.persistence.*;

@MappedSuperclass
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Producto {

    @Id
    protected Integer numero;
    protected String descripcion;

    public Integer getNumero() {
        return numero;
    }
    public void setNumero(Integer numero) {
        this.numero = numero;
    }
    public String getDescripcion() {
        return descripcion;
    }
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }


子类是:

package entities;


import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;

@Entity

@Table(name="elaborados")

public class Elaborado extends Producto {

    private float precioVenta;
    private int porcentajeGanancia;

@ManyToOne
private Unidad unidad;

@OneToMany
@JoinTable(
        name="compuestoDe",
        joinColumns = @JoinColumn( name="codProductoE"),
        inverseJoinColumns = @JoinColumn( name="codProductoSM")
        )
private List<Producto>componentes;

public float getPrecioVenta() {
    return precioVenta;
}
public void setPrecioVenta(float precioVenta) {
    this.precioVenta = precioVenta;
}
public int getPorcentajeGanancia() {
    return porcentajeGanancia;
}
public void setPorcentajeGanancia(int porcentajeGanancia) {
    this.porcentajeGanancia = porcentajeGanancia;
}
public Unidad getUnidad() {
    return unidad;
}
public void setUnidad(Unidad unidad) {
    this.unidad = unidad;
}
public List<Producto> getComponentes() {
    return componentes;
}
public void setComponentes(ArrayList<Producto> componentes) {
    this.componentes = componentes;
}


这是我必须解决的拼贴画练习。问题是我有一些限制。如果我将@Entity添加到超类,它将要求输入表Producto,而该表没有我也无法创建。
我也不能将继承类型更改为SINGLE_TABLE,因为老师为我提供了2个不同的子类表和0个超类表。

抱歉,类和属性的名称使用西班牙语。如果您需要我翻译它们,请告诉我。

最佳答案

从规格:


  与实体不同,映射的超类不可查询,并且不能作为参数传递给
  EntityManager或查询操作。


但是查询Producto是这段代码的作用:

@OneToMany
@JoinTable(
        name="compuestoDe",
        joinColumns = @JoinColumn( name="codProductoE"),
        inverseJoinColumns = @JoinColumn( name="codProductoSM")
        )
private List<Producto>componentes;


您必须将@MappedSuperclass更改为@Entity,并保持@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)匹配您所拥有的两个表。

InheritanceType.TABLE_PER_CLASS每个具体的类需要一个表,因此abstract class Producto不需要任何表。

08-03 13:07