Тип поля не поддерживается заявленной стратегией персистентности “OneToMany”

Мы плохо знакомы с JPA и пытающийся установить очень простую связь "один ко многим", где pojo, названный сообщением, может иметь список целочисленного идентификатора группы, определил названной объединяющей таблицей GROUP_ASSOC. Вот 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");

Вот 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;
    }
}

Я знаю, что это неправильно, поскольку существует нет @Column отображение на GROUP_ASSOC.GROUP_ID для groupIds свойства, но надо надеяться это иллюстрирует то, что мы пытаемся сделать. Когда мы выполняем следующий тестовый код, мы добираемся <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();

На помощь!

5
задан Lightbeard 22 March 2010 в 22:14
поделиться

1 ответ

Когда вы работаете с JPA, вы должны думать об объектах и отношениях между объектами, и вы должны отображать вашу объектную модель, а не ids, на вашу реляционную модель (можно отобразить List основных значений с @ElementCollection в JPA 2. 0, но то, что я сказал ранее, все еще применимо).

Здесь (если предположить, что это действительно one-to-many отношение между Message и GroupAssoc, а не many-to-many отношение между Message и Group сущностями) у вас должно быть что-то вроде этого:

@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()
}

И еще одна сущность для GroupAssoc.

PS: Ваш DDL действительно выглядит как (M:N) отношение между MESSAGE и GROUP (или я не понимаю PK ограничение для GROUP_ASSOC), но вы не показали никакого FK ограничения для GROUP_ID, поэтому я не уверен на 100%. Но если это так, то вам следует использовать @ManyToMany вместо @OneToMany.

3
ответ дан 15 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: