我们是JPA的新手,它尝试建立一种非常简单的一对多关系,在这种关系中,称为Message的pojo可以具有一个由称为GROUP_ASSOC的连接表定义的整数组ID的列表。这是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");

Here is the 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;
    }
}

我知道这是错误的,因为groupIds属性没有@Column映射到GROUP_ASSOC.GROUP_ID,但是希望这可以说明我们正在尝试做的事情。当我们运行以下测试代码时,我们得到<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();

帮助!

最佳答案

当您使用JPA时,您应该考虑对象和对象之间的关系,并且应该将对象模型(而不是ids)映射到关系模型(虽然在JPA 2.0中可以使用 List 映射基本值的@ElementCollection,但我之前所说的内容仍然适用)。

在这里,(假设这确实是MessageGroupAssoc之间的一对多关系,而不是MessageGroup实体之间的多对多关系),您应该具有以下内容:

@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确实看起来像MESSAGEGROUP之间的(M:N)关系(或者我不了解GROUP_ASSOC的PK约束),但是您没有在GROUP_ID上显示任何FK约束,所以我不确定100% 。但是如果是这样,那么您应该使用@ManyToMany而不是@OneToMany

关于jpa - 声明的持久性策略 "OneToMany"不支持字段类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2496131/

10-11 19:50
查看更多