gpt4 book ai didi

jpa - 声明的持久化策略不支持字段类型 "OneToMany"

转载 作者:行者123 更新时间:2023-12-02 03:10:07 28 4
gpt4 key购买 nike

我们是 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;
}
}

我知道这是错误的,因为没有 @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();

救命!

最佳答案

当您使用 JPA 时,您应该考虑对象以及对象之间的关系,并且应该将对象模型(而不是 ids)映射到关系模型(可以映射 JPA 2.0 中带有 @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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com