date - 无法在 Eclipselink 上合并日期

标签 date jpa ejb eclipselink jta

我的 session bean 没有对托管实体执行更新。

我已经包含了相关类的代码。当我使用 prime faces schedule 组件修改事件的日期字段并将修改后的实体传递给 session bean 并调用 em.merge(event) 时,实体管理器不会尝试更新实体并且不会在数据库。

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

实体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 托管 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 小面

<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 eclipse 链接
  • 到 MySQL 的 JTA 连接由 Glassfish 3 管理
  • JSF 2
  • Primefaces 3


解决方案:

根据 James 的回答,问题在于 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;

最佳答案

合并是否适用于其他(非日历)属性?

检查被合并对象的日历是否与被管理对象日历是同一个实例(==)。

您可能需要设置持久性单元属性, “eclipselink.temporal.mutable”=“真” (或在映射上使用@Mutable)

或者确保设置一个新的 Calendar 实例,而不是修改现有的实例。

关于date - 无法在 Eclipselink 上合并日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9478616/

相关文章:

php - 在 php.ini 中设置 date.timezone 不起作用

mysql - 仅在插入新行时设置 current_timestamp

java - 本地时区存储在 MySQL 中的 Spring Boot JPA 时间

java - 通过 @OneToMany 和 @ManyToOne 使用 JPA hibernate 获得无限递归

java - 如何在没有 Maven 的情况下使用 Arquillian?

c++ - 表示类中日期的最佳方式(日月年与时间戳)

java - java 中的日期比较搜索今天、明天

java - 使用 JPA 对字符串类型的数据库字段进行算术运算

jakarta-ee - JavaEE & JAX-RS : Resource Class Should Be Declared as Singleton or Stateless?

java - 创建实体时数据库表中的空值