我们是JPA的新手,并试图建立一个非常简单的一对多关系,其中一个叫做Message的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;
}
}Run Code Online (Sandbox Code Playgroud)
我知道这是错误的,因为没有@Column映射到GROUP_ASSOC.GROUP_IDgroupIds属性,但希望这说明我们正在尝试做什么.当我们运行以下测试代码时,我们得到了<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();Run Code Online (Sandbox Code Playgroud)
救命!
当您使用 JPA 时,您应该考虑对象以及对象之间的关系,并且应该将对象模型(而不是 )映射ids到关系模型(尽管可以在 JPA 2.0 中映射List基本值,@ElementCollection但我之前说过仍然适用)。
在这里,(假设这确实是和之间的一对多关系,而不是和实体之间的多对多关系)你应该有这样的东西:MessageGroupAssocMessageGroup
@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()
}
Run Code Online (Sandbox Code Playgroud)
和另一个实体GroupAssoc。
MESSAGEPS:你的DDL确实看起来像和之间的(M:N)关系GROUP(或者我不明白 的PK约束GROUP_ASSOC),但你没有显示任何FK约束GROUP_ID,所以我不是100%确定。但如果是这种情况,那么您应该使用 an@ManyToMany而不是@OneToMany。
| 归档时间: |
|
| 查看次数: |
2087 次 |
| 最近记录: |