Uploaded image for project: 'WildFly'
  1. WildFly
  2. WFLY-946

Hibernate NullPointerException while having a MappedSuperclass with @version attribute

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Won't Do
    • Icon: Major Major
    • None
    • None
    • JPA / Hibernate
    • None
    • Hide

      Create a simple EJB Project named "Test" and add the following classes to it

      package com.test;

      import javax.persistence.MappedSuperclass;
      import javax.persistence.Version;

      @MappedSuperclass
      public class BaseEntity
      {

      @Version
      private int version;

      public int getVersion()

      { return version; }

      public void setVersion(int version)

      { this.version = version; }

      }

      package com.test;

      import javax.persistence.Column;
      import javax.persistence.Entity;
      import javax.persistence.GeneratedValue;
      import javax.persistence.GenerationType;
      import javax.persistence.Id;
      import javax.persistence.Table;

      @Entity
      @Table(name = "CUSTOMER")
      public class Customer extends BaseEntity
      {

      @Id
      @Column(nullable = false)
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private int customerid;
      private String customername;
      private String addressline1;
      private String addressline2;
      private String city;
      private String state;
      private String country;
      private String pincode;
      private String agentname;

      public int getCustomerid()

      { return customerid; }

      public void setCustomerid(int customerid)

      { this.customerid = customerid; }

      public String getCustomername()

      { return customername; }

      public void setCustomername(String customername)

      { this.customername = customername; }

      public String getAddressline1()

      { return addressline1; }

      public void setAddressline1(String addressline1)

      { this.addressline1 = addressline1; }

      public String getAddressline2()

      { return addressline2; }

      public void setAddressline2(String addressline2)

      { this.addressline2 = addressline2; }

      public String getCity()

      { return city; }

      public void setCity(String city)

      { this.city = city; }

      public String getState()

      { return state; }

      public void setState(String state)

      { this.state = state; }

      public String getCountry()

      { return country; }

      public void setCountry(String country)

      { this.country = country; }

      public String getPincode()

      { return pincode; }

      public void setPincode(String pincode)

      { this.pincode = pincode; }

      public String getAgentname()

      { return agentname; }

      public void setAgentname(String agentname)

      { this.agentname = agentname; }

      }

      package com.test;

      import javax.persistence.Column;
      import javax.persistence.Entity;
      import javax.persistence.GeneratedValue;
      import javax.persistence.Id;
      import javax.persistence.Table;

      @Entity
      @Table(name = "SEASON")
      public class Season extends BaseEntity
      {
      private int seasonid;
      private String seasondisplayname;

      @Id
      @Column(nullable = false)
      @GeneratedValue
      public int getSeasonid()

      { return seasonid; }

      public void setSeasonid(int seasonid)

      { this.seasonid = seasonid; }

      public String getSeasondisplayname()

      { return seasondisplayname; }

      public void setSeasondisplayname(String seasondisplayname)

      { this.seasondisplayname = seasondisplayname; }

      }

      2. Deploy this jar to Jboss 7.1.1 server. Deployment will fail.

      Show
      Create a simple EJB Project named "Test" and add the following classes to it package com.test; import javax.persistence.MappedSuperclass; import javax.persistence.Version; @MappedSuperclass public class BaseEntity { @Version private int version; public int getVersion() { return version; } public void setVersion(int version) { this.version = version; } } package com.test; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "CUSTOMER") public class Customer extends BaseEntity { @Id @Column(nullable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) private int customerid; private String customername; private String addressline1; private String addressline2; private String city; private String state; private String country; private String pincode; private String agentname; public int getCustomerid() { return customerid; } public void setCustomerid(int customerid) { this.customerid = customerid; } public String getCustomername() { return customername; } public void setCustomername(String customername) { this.customername = customername; } public String getAddressline1() { return addressline1; } public void setAddressline1(String addressline1) { this.addressline1 = addressline1; } public String getAddressline2() { return addressline2; } public void setAddressline2(String addressline2) { this.addressline2 = addressline2; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getPincode() { return pincode; } public void setPincode(String pincode) { this.pincode = pincode; } public String getAgentname() { return agentname; } public void setAgentname(String agentname) { this.agentname = agentname; } } package com.test; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "SEASON") public class Season extends BaseEntity { private int seasonid; private String seasondisplayname; @Id @Column(nullable = false) @GeneratedValue public int getSeasonid() { return seasonid; } public void setSeasonid(int seasonid) { this.seasonid = seasonid; } public String getSeasondisplayname() { return seasondisplayname; } public void setSeasondisplayname(String seasondisplayname) { this.seasondisplayname = seasondisplayname; } } 2. Deploy this jar to Jboss 7.1.1 server. Deployment will fail.

      I am planning to have all the Entities in my project extend the common attribute from a BaseEntity. Currently I have only one field named Version in the base entity. I have marked the BaseEntity with the annotation of @MappedSuperclass as per the JPA standard. Everything works fine when I have only one Extended class (say Customer). But when I included an additional extended class, the EJB application's deployment failed with a NullPointerException. Stack trace for the same is given below

      org.jboss.msc.service.StartException in service jboss.persistenceunit."Test.jar#primary": Failed to start service
      at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1767) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [rt.jar:1.7.0_05]
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [rt.jar:1.7.0_05]
      at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_05]
      Caused by: java.lang.NullPointerException
      at org.hibernate.ejb.metamodel.AttributeFactory$6.resolveMember(AttributeFactory.java:947)
      at org.hibernate.ejb.metamodel.AttributeFactory.determineAttributeMetadata(AttributeFactory.java:423)
      at org.hibernate.ejb.metamodel.AttributeFactory.buildVersionAttribute(AttributeFactory.java:153)
      at org.hibernate.ejb.metamodel.MetadataContext.applyVersionAttribute(MetadataContext.java:301)
      at org.hibernate.ejb.metamodel.MetadataContext.wrapUp(MetadataContext.java:206)
      at org.hibernate.ejb.metamodel.MetamodelImpl.buildMetamodel(MetamodelImpl.java:64)
      at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:91)
      at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
      at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889)
      at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)
      at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:162)
      at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.start(PersistenceUnitServiceImpl.java:85)
      at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
      at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
      ... 3 more

      I could not find any workarounds for it. I have attached the sample code that can be used to reproduce the issue.

            smarlow1@redhat.com Scott Marlow
            sai.krish Sai Krish (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved:

                Estimated:
                Original Estimate - 1 hour
                1h
                Remaining:
                Remaining Estimate - 1 hour
                1h
                Logged:
                Time Spent - Not Specified
                Not Specified