坚持一个实体后另一个实体~Netbeans,J2E,bean,EntityManager

时间:2014-12-15 16:18:56

标签: java javabeans entitymanager persist j2ep

我正在使用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 PART
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() getIDEvent类中公开时,问题是正确)。系统无法读取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;
}


}

1 个答案:

答案 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;

}

这是否意味着我不需要这最后一部分? :)