题
我们是新的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虽然,但我刚才所说前仍然适用)。
下面,(假设这确实是一个的一个对多强> Message
和GroupAssoc
而不是之间的关系的的许多对多强> 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
之间的关系(或我不明白GROUP_ASSOC
的PK约束),但你没有表现出对GROUP_ID
任何FK约束,所以我不100%的把握。但是,如果是这样的话,那么你应该使用@ManyToMany
代替@OneToMany
。