2016-10-05 9 views
0

factory-ear、factory-ejb、およびfactory-webの3つのモジュールを含むプロジェクトがあります。 ejb.jarとweb.warを内部に持つJBoss7にEARとしてデプロイされました。 私は私のEJBクラスでEntityManagerを取得するためにJBoss7.1.0:サブデプロイメントでnullという名前のパーシスタンスユニットが見つかりません

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

をしようとしたとき、私はpersistence.xmlのは/ APP_NAME/factory_earであるエラー

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

マイ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> 

を取得META-INF。

これはクラスローダーの問題である可能性があることを読んだことがあります。私は耳とWebモジュールのスコープと同じJPA APIの依存関係を持っています

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

私はそれらのうちの1つを削除できませんでした。どちらもビルドに必要です。

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; 
    } 
} 
+0

これで、persistence.xmlがEARを逃していることがわかりました。どうして? –

+0

どのようにイヤーファイルを作成していますか? – Kazaag

+0

プロジェクトルートフォルダに 'mvn clean install'または 'clean package'を実行します –

答えて

0

この問題は、あなたのMavenの依存関係が原因ではありません。

EARファイル内のMETA-INFディレクトリの内容は、通常、どのクラスローダでもアクセスできません。

したがって、persistence.xmlファイルをEARファイルのMETA-INFディレクトリに配置することはできません。代わりに、EJB jarファイルのMETA-INFディレクトリに移動します。

+0

persistentce.xmlをapp_name/factory_ejb/src/main/resources/META-INFに移動すると、このようなエラーが発生します。 hibernate.AnnotationException:マップされていないクラスを対象とする@OneToManyまたは@ManyToManyの使用:com.test.model.Body.cars [com.test.model.Car] 'code' com.test.model.Bodyおよびcom.test.model 。これはpersistence.xmlにマップされたクラスです。 –

+0

これらのクラスはWARアプリケーションにありますか?あなたのWARにはいくつかのクラスがあり、あなたのEJBにはいくつかのクラスがありますか?マッピングされたすべてのJPAクラスを同じモジュールに配置する必要があります。 –

+0

これらのクラスはすべて、EJBアプリケーション内にあります。 –

関連する問題