Тип поля не поддерживается заявленной стратегией сохранения "OneToMany"
Мы новички в JPA и пытаемся установить очень простое отношение один-ко-многим, где pojo с именем Message может иметь список целочисленных идентификаторов группы, определенных таблицей соединений с именем GROUP_ASSOC
, Вот DDL:
CREATE TABLE "APP". "MESSAGE" (INTEGER "MESSAGE_ID" НЕ ОБЪЕДИНЯЕТСЯ ВСЕГДА В КАЧЕСТВЕ ИДЕНТИЧНОСТИ (НАЧАТЬ С 1, УВЕЛИЧИТЬ НА 1)); ALTER TABLE "APP"."MESSAGE" ДОБАВИТЬ КОНСТРАИНТ "MESSAGE_PK" ПЕРВИЧНЫЙ КЛЮЧ ("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" ПЕРВИЧНЫЙ КЛЮЧ ("MESSAGE_ID", "GROUP_ID"); ALTER TABLE "APP"."GROUP_ASSOC" ADD CONSTRAINT "GROUP_ASSOC_FK" FOREIGN KEY ("MESSAGE_ID") ССЫЛКИ "APP"."MESSAGE" ("MESSAGE_ID");
Вот Пойо:
@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();
Помогите!
1 ответ
Когда вы работаете с JPA, вы должны думать об объекте и отношениях между объектами, и вы должны отобразить модель объекта, а не ids
, к вашей реляционной модели (можно отобразить List
основных ценностей с @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
(или я не понимаю ограничения PK GROUP_ASSOC
) но вы не показали никаких ограничений FK на GROUP_ID
так что я не уверен на 100%. Но если это так, то вы должны использовать @ManyToMany
вместо @OneToMany
,