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 回答
1

我刚刚不得不处理这种相同类型的异常;“不能将 X 转换为 X。” 其中“X”是同一类。

事实证明,这是两个相互影响的问题。我对我的一些代码的 pom.xml 文件(maven 的 makefile)进行了更改,该文件说我的类将“包含”(编译而不是提供)在 WAR 文件中。但它也可以在“外部”EAR 模块中使用。

类加载器正在处理同一个 jar 文件的 2 个不同实例(即,它的 2 个副本)。这使类加载器认为它是 2 个不同的类,从而导致异常。

为了最终修复它,我必须将编译后的内容更改为 WAR 文件 pom.xml 中提供的内容,但要确保 EAR 文件的 pom 确实包含项目 jar 文件。

但随后我还必须采取措施确保我已运行“clean”以删除所有 WAR 和 EAR 文件的 jar 库内容,这样就不会找到额外的副本。

由于 WAR 位于 EAR 中,因此整理文件的内容可能会让人感到困惑,并且您必须解压缩 WAR 以获取其内容列表并多次运行针对文件的不同日期进行的构建。

于 2014-05-22T15:03:09.477 回答