4

JPA と Glassfish 4.0 を試しています。

私はこのようなユーザークラスを書きました(関連する部分だけで、コンパイルできるかどうかはわかりません):

public class User implements Serializable {
   private static final long serialVersionUID = 1L;
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Basic(optional = false)
   @Column(name = "id")
   private Integer id;
   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 50)
   @Column(name = "first_name")
   private String firstName;

   @JoinColumn(name = "country_id", referencedColumnName = "id")
   @ManyToOne(optional = false)
   private Country country;

   public void setCountry(Country countryId) {
      this.country = countryId;
   }
}

私の TestController (関連する部分のみ):

@ManagedBean(name = "testController", eager = true)
@RequestScoped
public class TestController implements Serializable {
   @EJB
   private dk.iqtools.session.UserFacade userFacade; 

   public String Insert(){
      factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
      EntityManager em = factory.createEntityManager();
      Query cq = em.createQuery("select c from Country c where c.id = 302");
      List<Country> countryList = cq.getResultList();

  User user = new User();
  user.setFirstName("Hans123");
  user.setLastName("Knudsen333");
  user.setCountry((Country)countryList.get(0));  <- throws an ERROR
  user.setPassword("secret");
  user.setYearOfBirth(1966);
  user.setGender(1);
  user.setEmail("haps@hfhfh.dk2243");

  userFacade.create(user);

 return "";

}

そして、私の Country Bean は、次の場所にある単純な属性を持つプレーンな Bean です。

dk.iqtools.entity

一般的には機能しますが、コードでエラーが発生した場合、次のエラーが永続的に表示されます。

Caused by: java.lang.ClassCastException: 
dk.iqtools.entity.Country cannot be cast to dk.iqtools.entity.Country
at dk.iqtools.controller.TestController.Insert(TestController.java:65)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

問題のあるステートメントは次のとおりです。

user.setCountry((Country)countryList.get(0));

なぜそれが起こるのか誰か教えてもらえますか?すべてが期待どおりに実行された場合、ユーザーはデータベースに挿入されます。しかし、たとえば、既に存在するユーザーを挿入しようとすると、データベース エラーが発生します。

次回は奇妙な例外を受け取ります。クラスをそれ自体にキャストできない理由がわかりません。

それを取り除くには、GF インスタンスを再起動する必要があります。

あまり生産的ではありません。

ご意見ありがとうございます。

4

2 に答える 2

2

これは、アプリケーションの古いバージョンの EntityManagerFactory の一部が残っているために発生します。アプリを再デプロイした後、何らかの形でそのクラスローダーが生き残ったのです。

あなたがする必要があるのは、再デプロイが発生する直前に EntityManagerFactory を閉じることです。それを達成するために ServletContextListeners を使用できます。これにより、Web アプリの初期化と破棄にイベントをアタッチできます。

ServletContextListener 実装の非常に単純な例を次に示します: http://4dev.tech/2015/08/example-of-servletcontextlistener-implementation/

于 2015-08-18T00:24:56.923 に答える