0

I have a project with 3 modules inside: factory-ear, factory-ejb and factory-web. It deployed to JBoss7 as EAR with ejb.jar and web.war inside. When I trying to get EntityManager in my EJB class

@PersistenceContext(unitName = "manager1")
private EntityManager em;

I get error

JBAS011440: Can't find a persistence unit named manager1 in subdeployment "factory-ejb-1.0-SNAPSHOT.jar" of deployment "factory.ear"

My persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="manager1" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:jboss/datasources/PostgresDS</jta-data-source>
        <class>com.test.model.Car</class>
        <class>com.test.model.Engine</class>
        <class>com.test.model.Body</class>
        <class>com.test.model.Transmission</class>
        <properties>
         <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
         <property name="hibernate.show_sql" value="true" />
         <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
</persistence>

The persistence.xml is in the app_name/factory_ear/META-INF.

I have read that this can be a problem of classloaders. I have same JPA API dependency with provided scope in ear and web modules

  <dependency>
     <groupId>org.hibernate.javax.persistence</groupId>
     <artifactId>hibernate-jpa-2.0-api</artifactId>
     <scope>provided</scope>
  </dependency> 

But I was not able to remove one of them. Both are necessary for build.

Body.java

@Entity
@Table(name = "body")
public class Body {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "type")
    private String type;

    @Column(name = "color")
    private String color;

    @Column(name = "doors_num")
    private Integer doorsNumber;

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

    @OneToMany(mappedBy = "body")
    private Set<Car> cars;

    /**
     * @return the id
     */
    public Integer getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * @return the type
     */
    public String getType() {
        return type;
    }

    /**
     * @param type the type to set
     */
    public void setType(String type) {
        this.type = type;
    }

    /**
     * @return the color
     */
    public String getColor() {
        return color;
    }

    /**
     * @param color the color to set
     */
    public void setColor(String color) {
        this.color = color;
    }

    /**
     * @return the doorsNumber
     */
    public Integer getDoorsNumber() {
        return doorsNumber;
    }

    /**
     * @param doorsNumber the doorsNumber to set
     */
    public void setDoorsNumber(Integer doorsNumber) {
        this.doorsNumber = doorsNumber;
    }

    /**
     * @return the vin
     */
    public Integer getVin() {
        return vin;
    }

    /**
     * @param vin the vin to set
     */
    public void setVin(Integer vin) {
        this.vin = vin;
    }

    /**
     * @return the cars
     */
    public Set<Car> getCars() {
        return cars;
    }

    /**
     * @param cars the cars to set
     */
    public void setCars(Set<Car> cars) {
        this.cars = cars;
    }
}

Car.java

public class Car {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "model")
    private String model;

    @ManyToOne
    @JoinColumn(name = "engine_id")
    private Engine engine;

    @ManyToOne
    @JoinColumn(name = "body_id")
    private Body body;

    @ManyToOne
    @JoinColumn(name = "transmission_id")
    private Transmission transmission;

    /**
     * @return the id
     */
    public Integer getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * @return the model
     */
    public String getModel() {
        return model;
    }

    /**
     * @param model the model to set
     */
    public void setModel(String model) {
        this.model = model;
    }

    /**
     * @return the engine
     */
    public Engine getEngine() {
        return engine;
    }

    /**
     * @param engine the engine to set
     */
    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    /**
     * @return the body
     */
    public Body getBody() {
        return body;
    }

    /**
     * @param body the body to set
     */
    public void setBody(Body body) {
        this.body = body;
    }

    /**
     * @return the transmission
     */
    public Transmission getTransmission() {
        return transmission;
    }

    /**
     * @param transmission the transmission to set
     */
    public void setTransmission(Transmission transmission) {
        this.transmission = transmission;
    }
}
evgeny_s
  • 391
  • 1
  • 6
  • 17

1 Answers1

1

This problem is not caused by your maven dependencies.

The content of the META-INF directory in an EAR file is generally inaccessible to any class loader.

Therefore, you cannot put your persistence.xml file in the META-INF directory of the EAR file. Move it into the META-INF directory of the EJB jar file instead.

Steve C
  • 18,876
  • 5
  • 34
  • 37
  • If I move persistentce.xml into the app_name/factory_ejb/src/main/resources/META-INF I get such error: `code` org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.test.model.Body.cars[com.test.model.Car] `code` com.test.model.Body and com.test.model.Car this is classes mapped in persistence.xml – evgeny_s Oct 07 '16 at 17:19
  • Are these classes in your WAR application? Do you have some classes in your WAR and some in your EJB? You need to have all your mapped JPA classes in the same module. – Steve C Oct 07 '16 at 17:24
  • All these classes in my EJB application. – evgeny_s Oct 07 '16 at 17:33
  • Now you need to show your classes. Note that the `...` elements in your persistence.xml file are redundant and could be removed. – Steve C Oct 07 '16 at 17:43
  • I have placed a code of these two classes in the question above. – evgeny_s Oct 07 '16 at 18:06
  • `class Car` is missing the `@Entity` annotation – Steve C Oct 07 '16 at 18:13