2016-10-05 52 views
0

我有一個內部有3個模塊的工程:factory-ear,factory-ejb和factory-web。它被部署到JBoss7中,作爲內部包含ejb.jar和web.war的EAR。 當我試圖讓EntityManager的在我的EJB類JBoss7.1.0:在子部署中找不到名爲null的持久性單元

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

我得到錯誤

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> 

persistence.xml中是在APP_NAME/factory_ear/META-INF。

我讀過這可能是一個類加載器的問題。我在耳朵和網絡模塊

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

與提供的範圍相同的JPA API的依賴,但我無法刪除其中的一個。兩者都是構建所必需的。

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

你是如何創建ear文件的? – 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中,會出現這樣的錯誤:'code' org。 hibernate.AnnotationException:使用@OneToMany或@ManyToMany定位未映射的類:com.test.model.Body.cars [com.test.model.Car]'code' com.test.model.Body and com.test.model .Car這是在persistence.xml中映射的類 –

+0

WAR應用程序中是否有這些類?你的WAR中有一些類,EJB中有一些嗎?您需要將所有映射的JPA類都放在同一個模塊中。 –

+0

我的EJB應用程序中的所有這些類。 –

相關問題