2012-02-28 17 views
3

我的會話bean不會在管理實體上執行更新。未能在Eclipselink上合併日期

我已經包含了相關類的代碼。當我通過使用prime faces schedule組件修改事件的日期字段並將修改後的實體傳遞給會話bean並調用em.merge(event)時,實體管理器不會嘗試更新實體,並且沒有在數據庫。

會話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()); 
    } 
} 

實體Bean

@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 Managed Bean的

@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 

開:

  • EJB 3
  • JPA 2的EclipseLink
  • JTA連接到MySQL通過Glassfish的3
  • JSF管理2
  • Primefaces 3


SOLUTION:

按照詹姆斯的答案,問題在於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; 
+0

你可以添加DefaultScheduleModel的定義嗎? – perissf 2012-02-28 08:38:30

+0

@perissf http://www.dzeek.net/javadoc/primefacesdocs/org/primefaces/model/DefaultScheduleModel.html – klonq 2012-02-28 08:42:22

+0

謝謝。我看到calendarSession.move(calendarEvent),但在CalendarSessionBean中有moveEvent。如何在AgendaMBean中獲取calendarSession?你有什麼異常嗎? – perissf 2012-02-28 08:58:57

回答

4

是否在其他(非日曆)的合併工作屬性?

檢查被合併對象的日曆是否與託管對象日曆中的實例(==)相同。

您可能需要設置持久性單元屬性, 「eclipselink.temporal.mutable」 =「真」 (或映射使用@Mutable)

或確保新的日曆實例設置,而不是修改現有的。

+0

非常棒,這也解決了這個問題:http://stackoverflow.com/questions/43007510/calendar-object-wont-update-in-database-but-does-update-within-session – 2017-03-25 09:31:50