我们是新的JPA,并试图建立一个非常简单的一对多关系,其中一个名为消息POJO可以有已定义整组ID列表通过连接表称为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的组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,映射到关系模型(这是可能的地图的List =” http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection”相对= “nofollow noreferrer”> @ElementCollection 在JPA 2.0虽然,但我刚才所说前仍然适用)。

下面,(假设这确实是一个的一个对多 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真的看起来像(M:N)MESSAGEGROUP之间的关系(或我不明白GROUP_ASSOC的PK约束),但你没有表现出对GROUP_ID任何FK约束,所以我不100%的把握。但是,如果是这样的话,那么你应该使用@ManyToMany代替@OneToMany

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top