Я занимаюсь разработкой программного обеспечения с Java EE, Glassfish и Netbeans, и у меня есть проблема из-за отсутствия опыта Java.Сохранять сущность за другим объектом ~ Netbeans, J2E, bean, EntityManager
Я разрабатываю веб-сайт, который предлагает пользователям возможность создавать события.
Мне удалось сохранить в таблице event
информацию о событиях (ID, имя, место, дата, создатель), и теперь проблема состоит в том, чтобы заполнить другую таблицу calendar
. В этой таблице есть только 3 атрибута: идентификатор (сгенерированный автоматически и последовательно), адрес электронной почты создателя и идентификатор события. Цель этой таблицы calendar
- собрать все пару пользовательских событий: событие может быть связано не только с его создателем, но и с другими приглашенными пользователями.
Когда я пытаюсь сделать постоянные данные в таблице calendar
а я получаю NullPointerException
потому что в event
таблице ID генерируется автоматически и я думаю, что, когда я называю метод getEventID
, это значение по-прежнему null
.
Как я могу активировать CalendarManager
, который имеет просто взять создателя и ID события и записать их в calendar
таблице?
Я надеюсь, что было ясно, здесь есть некоторые файлы:
EventManager
работает отлично:
@Stateless
public class EventManager {
@PersistenceContext
public EntityManager em;
@Inject
Principal principal;
public void saveEvent(Event event) {
em.persist(event);
}
public void deleteEvent(Event event) {
em.remove(event);
}
}
CalendarEventsManager
это хорошо, но не получает правильные параметры:
@Stateless
public class CalendarEventsManager {
@PersistenceContext
public EntityManager cm;
@Inject
Principal principal;
public void saveCalendarEvents(CalendarEvents calendarevents) {
cm.persist(calendarevents);
}
public void deleteCalendarEvents(CalendarEvents calendarevents) {
cm.remove(calendarevents);
}
}
Ниже приведена КРИТИЧЕСКАЯ ЧАСТЬ в компоненте, который активируется при нажатии пользователем «Создать событие»:
public String saveEvent() {
/* obtain the creator's email */
creator = um.getLoggedUser().getEmail();
this.event.setCreator(creator);
/* save information in db event */
em.saveEvent(event);
/* save information in db calendar */
eventid = event.getID();
this.calendarevents.setUserEmail(creator);
this.calendarevents.setEventID(eventid);
cm.saveCalendarEvents(calendarevents);
/* next page to visualize */
return "displayEvent";
}
До em.saveEvent(event)
все нормально, и база данных корректно обновляется, но проблема в том, что, когда я eventid = getID()
(getID
является общедоступным в Event
классе и правильно). Система не может прочитать идентификатор, потому что он не читает из только что обновленной базы данных.
Здесь есть класс Event:
@Entity
@Table(name="event")
public class Event implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
private Integer id;
@NotNull(message = "May not be empty")
private String name;
@NotNull(message = "May not be empty")
private String place;
@NotNull(message = "May not be empty")
private String eventdate;
@NotNull(message = "May not be empty")
private String type;
@NotNull(message = "May not be empty")
private String visibility;
/*@NotNull(message = "May not be empty")
private String weather;*/
@NotNull(message = "May not be empty")
private String creator;
public void setID(Integer id){
this.id = id;
}
public Integer getID() {
return id;
}
public void setName(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPlace() {
return place;
}
public void setPlace(String place) {
this.place = place;
}
public String getDate() {
return eventdate;
}
public void setDate(String eventdate) {
this.eventdate = eventdate;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getVisibility() {
return visibility;
}
public void setVisibility(String visibility) {
this.visibility = visibility;
}
/*public String getWeather() {
return weather;
}
public void setWeather(String weather) {
this.weather = weather;
}*/
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
Есть ли у вас какие-то идеи, чтобы решить эту проблему? Я читал о @PostPersist
аннотацию, но я не знаю, как применять его правильно :(
Спасибо совет всем, кто попытается помочь мне: D
EDIT1: ошибка, вероятно, в этом коде в saveEvent():
this.calendarevents.setUserEmail(creator);
this.calendarevents.setEventId(eventid);
System.out.println("event id after get is: " + this.calendarevents.getUserEmail());
System.out.println("event id after get is: " + this.calendarevents.getEventId());
cm.saveCalendarEvents(calendarevents);
Я поставил System.out.println проверить значение, но ошибка в «this.calendarevents», потому что никаких признаков System.out! Здесь есть полный Бин!
@Named(value = "createBean")
@RequestScoped
public class CreateEventBean {
@EJB
private EventManager em;
@EJB
private UserManager um;
private Event event;
private String creator;
@EJB
private CalendarEventsManager cm;
private Integer eventid=0;
private CalendarEvents calendarevents;
public CreateEventBean() {
}
public Event getEvent() {
if (event == null){
event = new Event();
}
return event;
}
public void setEvent(Event event) {
this.event = event;
}
public CalendarEvents getCalendarEvent() {
if (calendarevents == null){
calendarevents = new CalendarEvents();
}
return calendarevents;
}
public void setCalendarEvents(CalendarEvents calendarevents) {
this.calendarevents = calendarevents;
}
public String saveEvent(){
/*obtain the creator's email*/
creator=um.getLoggedUser().getEmail();
this.event.setCreator(creator);
/*save information in db event*/
em.saveEvent(event);
/*save information in db calendar*/
System.out.println("event id before get is: " + eventid);
eventid=event.getId();
System.out.println("event id after get is: " + eventid);
this.calendarevents.setEventId(eventid);
System.out.println("eventid in calendar could be: " + this.calendarevents.getEventId());
this.calendarevents.setUserEmail(creator);
System.out.println("useremail in calendar could be: " + this.calendarevents.getUserEmail());
cm.saveCalendarEvents(calendarevents);
/*next page to visualize*/
return "displayEvent";
}
}
Я действительно не поймать ошибку в "this.calendarevents.setEventId() кода события;" это строка 80, и ошибка такова: Причина: Предупреждение: # {createBean.saveEvent()}: java.lang.NullPointerException javax.faces.FacesException: # {createBean.saveEvent()}: java.lang.NullPointerException [Вызванный: java.lang.NullPointerException на it.nyquistmeteocal.beans.CreateEventBean.saveEvent (CreateEventBean.java:80)]
Вот CalendarEvents Класс:
@Entity
@Table(name="calendarevents")
public class CalendarEvents implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
private Integer id;
@NotNull(message = "May not be empty")
private String useremail;
@NotNull(message = "May not be empty")
private Integer eventid;
public Integer getId() {
return id;
}
public void setName(Integer id) {
this.id = id;
}
public String getUserEmail() {
return useremail;
}
public void setUserEmail(String useremail) {
this.useremail = useremail;
}
public Integer getEventId() {
return eventid;
}
public void setEventId(Integer eventid) {
this.eventid = eventid;
}
}
пожалуйста, напишите свой класс событий – fmodos
Я редактировал свой пост;) – gatb27
пытаются переименовать 'getID' в' getId' и '' setID' к setId' – fmodos