0

@MappedSuperclass作成日や最終更新日などのメタデータを含む があります。私のエンティティはすべてこのクラスを拡張します。@PreUpdateこのクラスには、対応するアクションの前にこれらのプロパティを設定する で注釈が付けられたメソッドもあります。

現在私を夢中にさせているのは、これがエンティティ A と C では機能するが、B では機能しないことです。これらはすべて、これBaseEntityを直接拡張します。基本的に、動作が異なる理由はありません。さらに紛らわしいのは@PrePresist、すべてのエンティティで正しく呼び出されていることです。B.

なぜこれが起こるのか誰にも分かりますか?それは私を夢中にさせています...

public class A extends BaseEntity {}

public class B extends BaseEntity {}

public class C extends BaseEntity {}

@MappedSuperclass
public abstract class BaseEntity implements Serializable {

    @Getter
    @Setter(AccessLevel.PROTECTED)
    @Version
    private Long version;

    @Getter
    @Setter(AccessLevel.PROTECTED)
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created")
    private Date created;

    @Getter
    @Setter(AccessLevel.PROTECTED)
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "last_modified")
    private Date lastModified;

    @Getter
    @Setter(AccessLevel.PROTECTED)
    @Column(name = "created_by")
    private String createdBy;

    @Getter
    @Setter(AccessLevel.PROTECTED)
    @Column(name = "last_modified_by")
    private String lastModifiedBy;

    @PreUpdate
    public final void updateMetadata() {
        lastModified = new Date();
        if (SecurityContextHolder.getContext().getAuthentication() != null) {
            lastModifiedBy = SecurityContextHolder.getContext()
                    .getAuthentication().getName();
        }
    }

    @PrePersist
    public final void createMetadata() {
        created = new Date();
        lastModified = created;
        if (SecurityContextHolder.getContext().getAuthentication() != null) {
            final String userName = SecurityContextHolder.getContext()
                    .getAuthentication().getName();
            lastModifiedBy = userName;
            createdBy = userName;
        }
    }
}
4

1 に答える 1

3

申し訳ありませんが、問題は次のとおりです。

テストは、SpringJUnit4ClassRunner. 問題は、エンティティ B のテストに という注釈が付けられていること@Transactionalです。これは@PreUpdate、テストが完了した後にのみ呼び出されるため、テストが失敗することを意味します。

に関して同じ方法ですべてのエンティティに注釈が付けられている場合、動作はすべてのエンティティで同じ@Transactionalです。

@PrePersistこれは、トランザクションが完了する前でも即座に呼び出されるように見えるため、問題はありません。

于 2013-05-21T12:29:16.250 に答える