El tipo de campo no es compatible con la estrategia de persistencia declarada “OneToMany”

StackOverflow https://stackoverflow.com/questions/2496131

  •  21-09-2019
  •  | 
  •  

Pregunta

son nuevos en la APP y tratando de configuración muy sencilla a muchos relación en la que un POJO llamada mensaje puede tener una lista de Identificación del grupo entero está definido por una tabla de unión llamado GROUP_ASSOC. Aquí está el DDL:

CREATE TABLE "APP"."MESSAGE" (
        "MESSAGE_ID" INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)
    );

ALTER TABLE "APP"."MESSAGE" ADD CONSTRAINT "MESSAGE_PK" PRIMARY KEY ("MESSAGE_ID");

CREATE TABLE "APP"."GROUP_ASSOC" (
        "GROUP_ID" INTEGER NOT NULL,
        "MESSAGE_ID" INTEGER NOT NULL
    );

ALTER TABLE "APP"."GROUP_ASSOC" ADD CONSTRAINT "GROUP_ASSOC_PK" PRIMARY KEY ("MESSAGE_ID", "GROUP_ID");

ALTER TABLE "APP"."GROUP_ASSOC" ADD CONSTRAINT "GROUP_ASSOC_FK" FOREIGN KEY ("MESSAGE_ID")
    REFERENCES "APP"."MESSAGE" ("MESSAGE_ID");

Aquí está el POJO:

@Entity
@Table(name = "MESSAGE")
public class Message {
    @Id
    @Column(name = "MESSAGE_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int messageId;

    @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.PERSIST)
    private List groupIds;

    public int getMessageId() {
        return messageId;
    }
    public void setMessageId(int messageId) {
        this.messageId = messageId;
    }
    public List getGroupIds() {
        return groupIds;
    }
    public void setGroupIds(List groupIds) {
        this.groupIds = groupIds;
    }
}

Sé que esto es un error ya que no hay ninguna asignación @Column a GROUP_ASSOC.GROUP_ID para la propiedad groupIds, pero espero que esto ilustra lo que estamos tratando de hacer. Cuando ejecutamos el siguiente código de prueba que obtenemos <openjpa-1.2.3-SNAPSHOT-r422266:907835 fatal user error> org.apache.openjpa.util.MetaDataException: The type of field "pojo.Message.groupIds" isn't supported by declared persistence strategy "OneToMany". Please choose a different strategy.

Message msg = new Message();
List groups = new ArrayList();
groups.add(101);
groups.add(102);
EntityManager em = Persistence.createEntityManagerFactory("TestDBWeb").createEntityManager();
em.getTransaction().begin();
em.persist(msg);
em.getTransaction().commit();

Ayuda!

¿Fue útil?

Solución

Cuando se está trabajando con la APP, usted debe pensar de objetos y las relaciones entre los objetos y se debe asignar el modelo de objetos, no ids, a su modelo relacional (es posible asignar una List de los valores básicos con @ElementCollection en JPA 2.0, pero aunque lo que dije justo antes todavía se aplica).

A continuación, (suponiendo que esto realmente es un uno-a-muchos relación entre Message y GroupAssoc y no un muchos-a-muchos relación entre entidades Message y Group) usted debe tener algo como esto:

@Entity
@Table(name = "MESSAGE")
public class Message implements Serializable {
    @Id
    @Column(name = "MESSAGE_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)    
    private Long messageId;

    @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.PERSIST)    
    private List<GroupAssoc> groupAssocs = new ArrayList<GroupAssoc>();

    public Long getMessageId() {
        return messageId;
    }
    public void setMessageId(Long messageId) {
        this.messageId = messageId;
    }

    public List<GroupAssoc> getGroupAssocs() {
        return groupAssocs;
    }
    public void setGroupAssocs(List<GroupAssoc> groupAssocs) {
        this.groupAssocs = groupAssocs;
    }

    // equals() and hashCode()
}

Y otra entidad para su GroupAssoc.

PS: Su DDL realmente se parece a una (M: N) relación entre MESSAGE y GROUP (o no entiendo la restricción de PK GROUP_ASSOC) pero no mostró ninguna restricción FK en GROUP_ID así que no estoy 100% seguro. Pero si ese es el caso, entonces usted debe utilizar un @ManyToMany en lugar de @OneToMany.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top