1

2 つのエンティティと、派生した RequestFactory でそれぞれ 2 つのリクエスト タイプを定義しました。単体テストで単一のエンティティを永続化すると、正常に動作します。同じ単体テスト内で両方のエンティティを次々に永続化しようとすると、最初のエンティティが保存され、2 番目の発火も onSuccess で終了しますが、データベースにはデータが保存されません。RequestFacory を 1 つ、EventBus を 1 つ、リクエスト タイプを 2 つ使用します。

2 番目の persist.fire を最初の onSuccess メソッドに配置すると、対応する onSuccess メソッドはヒットせず、テストはメッセージなしで終了します。

2 つの無関係なエンティティを 1 つのコードに保持する方法は?

//Company
@Entity
public class Company {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "version")
    private Integer version;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Integer getVersion() {
        return version;
    }

    public void setVersion(Integer version) {
        this.version = version;
    }

    private String instance;

    public static Company findCompany(Long id) {
        EntityManager em = emf.createEntityManager();
        try {
            Company company = em.find(Company.class, id);
            return company;
        } finally {
            em.close();
        }
    }

    public void persist() throws PersistenceException {
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = null;
        try {
            tx = em.getTransaction();
            tx.begin();
            em.persist(this);
            tx.commit();
        } catch (RuntimeException e) {
            tx.rollback();
            throw e;
        } finally {
            em.close();
        }
    }
}

//CompanyRequest
@Service(Company.class)
public interface CompanyRequest extends RequestContext {
    Request<CompanyProxy> findCompany(Long id);

    InstanceRequest<CompanyProxy, Void> persist();

    InstanceRequest<CompanyProxy, Void> remove();
}

//ServiceProvider
similar to Company with ServiceProviderRequest

//RequestFactory
public interface AftdRequestFactory extends RequestFactory {
    CompanyRequest companyRequest();
    ServiceProviderRequest serviceProviderRequest();
}

//UnitTest
public void testSetupDatabase() {
    final EventBus eventBus = new SimpleEventBus();
    final AftdRequestFactory requestFactory = GWT.create(AftdRequestFactory.class);
    requestFactory.initialize(eventBus);

    CompanyRequest request = requestFactory.companyRequest();
    CompanyProxy newCompany = request.create(CompanyProxy.class);
    newCompany.setInstance("1");
    request.persist().using(newCompany);
    request.fire(new Receiver<Void>() {
        @Override
        public void onSuccess(Void arg0) {
            ServiceProviderRequest spRequest = requestFactory.serviceProviderRequest();
            ServiceProviderProxy newServiceProvider = spRequest.create(ServiceProviderProxy.class);
            newServiceProvider.setInstance("12345");
            spRequest.persist().using(newServiceProvider);
            spRequest.fire(new Receiver<Void>() {
                @Override
                public void onSuccess(Void arg0) {
                    System.out.println("service provider instance created");
                }

                @Override
                public void onFailure(ServerFailure error) {
                }
           });

        }

        @Override
        public void onFailure(ServerFailure error) {
            System.out.println("could not create company instances");
        }
    });
}
4

1 に答える 1

0

根本的な問題はタイミングの問題のようです。「delayTestFinish(30000)」を gwt 単体テストの先頭に追加すると、両方の onSuccess() メソッドが呼び出されて非同期スレッドが終了するまで、メイン スレッドは十分な時間待機します。

于 2013-01-28T14:26:42.210 に答える