0

環境

  1. グラスフィッシュ 4.0
  2. JPA-Eclipselink 2.5.0
  3. MySQL 5.5.29
  4. MySQL から Survey テーブルへのトリガー:

トリガーのコード

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

問題:

  1. DB to table に新しい調査を挿入する 調査
  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 に答える