2012-02-28 2 views
3

내 세션 bean은 관리 대상 엔티티에서 업데이트를 실행하지 않습니다.Eclipselink에서 날짜를 병합하지 못했습니다.

관련 클래스에 대한 코드가 포함되어 있습니다. 프라임 스 페이스 스케줄 구성 요소를 사용하여 이벤트의 날짜 필드를 수정하고 수정 된 엔티티를 세션 빈에 전달하고 em.merge (이벤트)를 호출하면 엔티티 관리자가 엔티티를 업데이트하지 않고 변경 사항이 데이터 베이스.

세션 빈

@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> 
를 관리 3,691,363,210

출력용

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
  • 글래스 피쉬 3
  • JSF 의해 관리 MySQL로 JTA 연결 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; 
+0

DefaultScheduleModel의 정의를 추가 할 수 있습니까? – perissf

+0

@perissf http://www.dzeek.net/javadoc/primefacesdocs/org/primefaces/model/DefaultScheduleModel.html – klonq

+0

감사합니다. 난 calendarSession.move (calendarEvent)를 볼 수 있지만 CalendarSessionBean에는 moveEvent가있다. calendarSession을 AgendaMBean으로 가져 오는 방법은 무엇입니까? 예외가 있습니까? – perissf

답변

4

기타 (비 일정)에 병합 작업 속성을합니까?

병합되는 개체의 일정이 관리되는 개체 일정과 동일한 인스턴스 (==)인지 확인하십시오.

당신은 퍼시스턴스 유닛 속성을 설정해야 할 수도 있습니다 "eclipselink.temporal.mutable"= "true"로 (또는 매핑에 @Mutable 사용)

하거나 새 일정 인스턴스가 설정되어 있는지 확인합니다, 기존의 것을 수정하는 대신에

+0

최고입니다.이 문제도 다음 주소에서 해결되었습니다. http://stackoverflow.com/questions/43007510/calendar-object-wont-update-in-database-but-does-update-within-session –

관련 문제