私は純粋なJPA2でJSF2を使用しています。しかし、問題はentityManagerにあります。
@PersistenceContext
private EntityManager entityManager;
ここでは、entityManagerは注入されず、常にnullになります。誰かが私のコードの何が悪いのか教えてくれませんか。
これが私の設定です。
User.java
@Entity
@Table(name="USER")
public class User {
private int id;
private String name;
private String surname;
@Id
@SequenceGenerator(name="user_id_seq_gen", sequenceName="USER_ID_GEN_SEQ", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="user_id_seq_gen")
@Column(name="ID", unique = true, nullable = false)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name="NAME", unique = true, nullable = false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name="SURNAME", unique = true, nullable = false)
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence 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" version="2.0">
<persistence-unit name="testUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>java:/comp/env/testDS</non-jta-data-source>
<class>com.user.external.test.User</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
<property name="hibernate.max_fetch_depth" value="6"/>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
Tomcat Server.xml
<Context docBase="usertools" path="/usertools" reloadable="true">
<ResourceLink name="testDS"
global="testDS"
type="javax.sql.DataSource"/>
</Context>
TestBean.java
@ManagedBean(name="testBean")
@ViewScoped
public class TestBean implements Serializable{
@ManagedProperty("#{testService}")
private ITestService testService;
public void saveData(User user){
testService.saveUser(user);
}
public void setTestService(ITestService testService){
this.testService = testService;
}
public ITestService getTestService(){
return testService;
}
}
TestServiceImpl.java
@ManagedBean(name="testService")
@ApplicationScoped
public class TestServiceImpl implements ITestService {
@ManagedProperty(value="#{testDAO}")
private ITestDAO testDAO;
public void saveUser(User user){
testDAO.saveUser(user);
}
public void setTestDAO(ITestDAO testDAO){
this.testDAO = testDAO;
}
public ITestDAO getTestDAO(){
return testDAO;
}
}
TestDao.java
@ManagedBean(name = "testDAO")
@ApplicationScoped
public class TestDAO implements ITestDAO {
@PersistenceContext
private EntityManager entityManager; // is null
public void saveUser(User user){
entityManager.persist(user); // Getting Null Pointer Here....
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public EntityManager getEntityManager() {
return entityManager;
}
}
@PersistenceContextの名前とunitNameの属性を試してみました。しかし、それでも機能していません。web.xmlのリソース設定でも試してみました
<persistence-context-ref>
<persistence-context-ref-name>testUnit</persistence-context-ref-name>
<persistence-unit-name>testUnit</persistence-unit-name>
</persistence-context-ref>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>testUnit</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
まだ運がない。誰か助けてくれませんか。