我正在使用Java EE,Glassfish和Netbeans进行软件工程项目,由于缺乏java经验,我遇到了问题。
我正在开发一个网站,为用户提供创建一些活动的可能性。
我能够在表event
中保存有关事件的信息(ID,姓名,地点,日期,创建者),现在问题是填充另一个表calendar
。在此表中,只有3个属性:ID(自动生成和顺序生成),创建者电子邮件和事件ID。此calendar
表的目的是收集所有成员用户事件:事件不仅可以耦合到其创建者,还可以耦合到受邀的其他用户。
当我尝试使calendar
表中的数据持久化时,我得到NullPointerException
,因为在event
表中ID会自动生成,我认为当我调用时getEventID
方法,此值仍为null
。
如何激活只需要获取事件的创建者和 ID 的CalendarManager
并将其写入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);
}
}
下面是用户点击"创建活动"
时激活的Bean中的 CRITICAL PARTpublic 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
类中公开时,问题是正确)。系统无法读取ID,因为它不会从刚刚更新的数据库中读取。
这里有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的迹象!这里有完整的Bean!
@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(eventid);"这是第80行,错误是这样的:引起:警告:#{createBean.saveEvent()}:java.lang.NullPointerException javax.faces.FacesException:#{createBean.saveEvent()}:java.lang.NullPointerException [由:java.lang.NullPointerException at 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 :(得分: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;
}
这是否意味着我不需要这最后一部分? :)