0

环境

  1. 玻璃鱼 4.0
  2. JPA - Eclipselink 2.5.0
  3. MySQL 5.5.29
  4. 在 MySQL 中触发到调查表:

触发器代码

CREATE TRIGGER `survey_BINS` 
BEFORE INSERT ON survey 
FOR EACH ROW
SET NEW.created = NOW();

问题:

  1. 将新调查插入数据库到表调查
  2. 创建的字段获得了正确的值,但 UI 中的实体仍然是没有创建日期时间的旧实体
  3. 如果我退出并刷新页面,我会得到创建的日期时间

问题

  1. 如何避免这种情况?
  2. @PrePersist 符号可以成为 JPA 实体中的答案吗?
  3. 关闭缓存可能会有所帮助,但性能如何?
  4. 任何想法或解决方案如何在插入/更新到 UI 后获取更新的实体?

调查实体

@Column(name = "created")
@Temporal(TemporalType.TIMESTAMP)
private Date created;

public Date getCreated() {
    return created;
}

public void setCreated(Date created) {
    this.created = created;
}

SurveyREST 服务

@Stateless
@Path("com.insame.entity.survey")
public class SurveyFacadeREST extends AbstractFacade<Survey> {
@PersistenceContext(unitName = "com.sesame_insame_war_1.0-SNAPSHOTPU")
private EntityManager em;

public SurveyFacadeREST() {
    super(Survey.class);
}

@POST
@Override
@Consumes({"application/xml", "application/json"})
public void create(Survey entity) {
    super.create(entity);
}

@PUT
@Override
@Consumes({"application/xml", "application/json"})
public void edit(Survey entity) {
    super.edit(entity);
}

抽象立面

public void create(T entity) {
    getEntityManager().persist(entity);
}

public void edit(T entity) {
    getEntityManager().merge(entity);
}

谢谢,萨米

4

2 回答 2

1
  1. 为避免这种情况,您需要在 java 中而不是在数据库中设置字段。因为当您保存实体时,它被插入到缓存中。要获取在数据库中更新的值,您需要刷新实体。

  2. 是的,此注释可以帮助您解决问题。@PrePersist 和 @PreUpdate 或使用相同的参数实现 onSave(Object[] state, String[] propertyNames, Type[] types) 或 onUpdate

  3. 如果您使用二级缓存并且将其关闭,您可能会降低性能,但也可能会发生您不会注意到任何事情的情况。Hibernate 2 级缓存通常不会带来很多性能提升。在更高的抽象级别上更好地使用缓存。这样的缓存可以提供更多的性能提升。但同样,您将无法使用数据库数据更新。

  4. 使用选项 2 中的解决方案:@PrePersist 和 @PreUpdate。

根据我的个人经验,我不建议您在触发器的帮助下使用数据更新。对我来说,他们大大降低了数据库的速度。此外,如果您使用数据库触发器或存储过程,它的可扩展性比使用 java 低。而且它也很难与缓存一起使用,因为您希望在某些数据更新时使必要的缓存区域过期。

于 2013-08-21T08:06:05.597 回答
1

如果您想使用触发器在插入时分配字段,请查看 EclipseLink 的 ReturningPolicy,它可用于在插入后检索值。有关注释说明,请参见http://eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_returninsert.htm#CIHHEGJE

于 2013-08-21T12:10:15.087 回答