Неспособность слить дату на Eclipselink - PullRequest
3 голосов
/ 28 февраля 2012

Мой сессионный компонент не выполняет обновление для управляемого объекта.

Я включил код для соответствующих классов. Когда я изменяю поле даты события с помощью компонента расписания простых лиц и передаю измененную сущность в сессионный компонент и вызываю em.merge (событие), менеджер сущностей не пытается обновить сущность, и никакие изменения не регистрируются в база данных.

Session Bean

@Stateless
@LocalBean
public class CalendarSessionBean implements Serializable {

    @PersistenceContext
    private EntityManager em;

    public void moveEvent (CalendarEvent event) {
        em.merge(event);
        Logger.getLogger("example").log(Level.INFO, "Moved {0}", event.getStartDate());
    }
}

Сущность Бин

@Entity
public class CalendarEvent implements Serializable {

    @Id
    private Long id;

    @PrePersist
    @PreUpdate
    void onUpdate () { // Never called
        Logger.getLogger("example").log(Level.INFO, "Updating event on the {0}", this.getStartDate());
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "DTE_STR", nullable = false)
    @NotNull
    private Date start; // Column that sould update

    // ... rest omitted        
}

Управляемый компонент JSF

@ManagedBean(name="agenda")
@ViewScoped
public class AgendaMBean implements Serializable {

    @EJB CalendarSessionBean calendarSession;

    public ScheduleModel getModel () {
        if (model == null) {
            model = new DefaultScheduleModel();

            final Collection<CalendarEvent> calendarEvents = calendarSession.findAll();
            for (final CalendarEvent calendarEvent : calendarEvents) {
                Log.log(Level.FINEST, "Adding to model the {0}", calendarEvent.getStartDate()); 
                final DefaultScheduleEvent event = new DefaultScheduleEvent();
                event.setId(String.valueOf(calendarEvent.getId()));
                event.setStartDate(calendarEvent.getStart());                
                event.setData(calendarEvent);
                model.addEvent(event);
            }
        }
        return model;
    }

    public void onEventMove (final ScheduleEntryMoveEvent event) {
        final CalendarEvent calendarEvent = 
                (CalendarEvent) event.getScheduleEvent().getData();
        Log.log(Level.FINEST, "Moving event to {0}", calendarEvent.getStartDate());
        calendarSession.moveEvent(calendarEvent);   
    }
}

JSF Facelet

<p:schedule value="#{agenda.model}">
    <p:ajax event="eventMove" 
            listener="#{agenda.onEventMove}"/>
</p:schedule>

выход

Adding to model the Fri Feb 03 00:00:00 CET 2012 // ManagedBean.getModel()
Moving event to Wed Feb 08 00:00:00 CET 2012 // ManagedBean.onEventMove()
Moved Wed Feb 08 00:00:00 CET 2012 // SessionBean.move()
// No PrePersist log statement

On:

  • EJB 3
  • JPA 2 EclipseLink
  • JTA-соединение с MySQL, управляемое Glassfish 3
  • JSF 2
  • Primefaces 3

<ч /> РЕШЕНИЕ:

Согласно ответу Джеймса, проблема заключается в обработке Eclipselink временных полей.

Ссылка: http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG)#How_to_Use_the_.40Mutable_Annotation

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "DTE_STR", nullable = false)
@Mutable(true) // Solution
@NotNull
private Date start;

1 Ответ

4 голосов
/ 28 февраля 2012

Работает ли слияние с другими (не календарными) атрибутами?

Проверьте, является ли Календарь объединяемого объекта тем же экземпляром (==), что и Календарь управляемых объектов.

Возможно, вам потребуется установить свойство единицы сохраняемости, "Eclipselink.temporal.mutable" = "истина" (или используйте @Mutable для сопоставления)

или убедитесь, что установлен новый экземпляр Calendar вместо изменения существующего.

...