Я пытаюсь сохранить сущность, которая имеет карту объектов для перечисления в хранилище данных Google App Engine. Классы сущностей аннотируются с использованием JPA.JPA Отношение многих-ко-многим с дополнительным столбцом перечисления
класс Event
import com.google.appengine.datanucleus.annotations.Unowned;
import com.google.appengine.api.datastore.Key;
import java.util.Map;
import javax.persistence.*;
import lombok.Builder;
import lombok.Data;
@Entity
@Builder
public @Data class Event {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
// I want a map belonging to event in order to query a particular user whether he confirmed his participation in the event
// All addressees are initially present in this map with response set to UNDEFINED
// If user has received and read notification, than the response is updated to YES, NO, or MAYBE
@Unowned
@ElementCollection
@CollectionTable(name = "user_response")
@MapKeyJoinColumn(name = "user_id")
@Enumerated
@Column(name = "response")
private Map<User, Response> addressees;
}
класс Response
public enum Response {
UNDEFINED, YES, NO, MAYBE
}
Я не определили никаких ссылок в User
класса к этой карте. Это однонаправленные отношения.
класс пользователя
@Entity
public @Data class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
}
колонна Event.addressees
кажется довольно сложным. Поэтому я проверил свой тест, чтобы проверить, все ли работает правильно. Ну, это не так. Я получил исключение, когда я пытался сохранить Event
объект в хранилище:
java.lang.IllegalArgumentException: addressees: Response is not a supported property type.
at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedSingleValue(DataTypeUtils.java:235)
at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:199)
at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:173)
at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:148)
at com.google.appengine.api.datastore.PropertyContainer.setProperty(PropertyContainer.java:101)
Согласно DataNucleus Enum является persistable типа данных по умолчанию. Поэтому я не понимаю, почему я получаю сообщение об ошибке "Response is not a supported property type"
.
Я подозревал, что проблема связана с классом User. Возможно, ассоциации от Event to Users недостаточно, и у пользователя также должна быть ассоциация с событиями. Поэтому я добавил events
поле для пользователя следующим образом:
@Unowned
@ElementCollection
@CollectionTable(name = "user_event_responses")
@ManyToMany(mappedBy="addressees", targetEntity = Event.class)
@MapKeyJoinColumn
@Enumerated
@Column(name = "response")
private Map<Event, Response> events;
Он не работает в любом случае. Затем я прочитал похожие вопросы и не нашел быстрого ответа.
Пожалуйста, покажите мне пример отношений «многие ко многим» с дополнительным столбцом в DataNucleus/JPA!