2014-12-15 4 views
1

Я занимаюсь разработкой программного обеспечения с 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; 
} 


} 
+0

пожалуйста, напишите свой класс событий – fmodos

+0

Я редактировал свой пост;) – gatb27

+0

пытаются переименовать 'getID' в' getId' и '' setID' к setId' – fmodos

ответ

0

Я решена проблема !!

Я просто изменил декларацию calendarevents таким образом:

private CalendarEvents calendarevents = new CalendarEvents(); 

я не делал это прежде, чем я думаю, что если calendarevents указывает на NULL он будет выполнен эту часть кода:

public CalendarEvents getCalendarEvent() { 
    if (this.calendarevents == null){ 
     this.calendarevents = new CalendarEvents(); 
    } 
    return this.calendarevents; 
} 

public void setCalendarEvents(CalendarEvents calendarevents) { 
    calendarevents = calendarevents; 

} 

Означает ли это, что мне не нужна эта последняя часть? :)

+0

Это означает, что вместо 'this.calendarevents.setEventId (eventid);' вы должны использовать 'this.getCalendarEvents(). SetEventId (eventid);' :) –

+0

Спасибо за ответ! :) – gatb27

 Смежные вопросы

  • Нет связанных вопросов^_^