【发布时间】:2017-07-31 16:37:36
【问题描述】:
我一直在寻找类似的问题,但没有实际结果,所以我尝试使用 JPA/Maven 创建简单的 DAO 层,但如果我使用它,那么当我使用 EntityManager 直到类,但是如果我使用 before 和 auto 注释创建 EntityManager 而没有其他任何东西,则测试效果很好。我收到了NullPointerException,但我不明白为什么(尤其是为什么要坚持方法在这种情况下有效)。
抽象测试
public abstract class AbstractPersistentTest {
protected static EntityManagerFactory emf = Persistence.createEntityManagerFactory("Services");
protected EntityManager em;
protected EntityTransaction tx;
@Before
public void initEntityManager() throws Exception {
em = emf.createEntityManager();
tx = em.getTransaction();
}
@After
public void closeEntityManager() throws SQLException {
if (em != null) em.close();
}
protected Integer getRandomId() {
return Math.abs(new Random().nextInt());
}
}
型号
@Entity
@Table(name = "test")
public class Test implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name = "title", nullable = false)
@Size(min = 0, max = 255)
private String title;
@Column(name = "descr", nullable = false, length = 16777215, columnDefinition = "Mediumtext")
private String descr;
@Column(name = "avatar", nullable = false)
private String avatar;
@Column(name = "date_add", nullable = false, insertable = false, updatable = false, columnDefinition = "Datetime DEFAULT CURRENT_TIMESTAMP")
@Temporal(TemporalType.TIMESTAMP)
private Date date_add;
public Test() {
}
//getters and setters
测试 DAO
public class TestDAO {
//@PersistenceContext(unitName = "Services")
//private EntityManager emgr;
public Integer persist(String title,
String avatar,
String descr) {
EntityManager em = EMgrUtil.createEntityManager();
EntityTransaction transaction = em.getTransaction();
Test test = new Test();
try {
transaction.begin();
test.setTitle(title);
test.setAvatar(avatar);
test.setDescr(descr);
em.persist(test);
transaction.commit();
}
catch(RuntimeException e) {
e.printStackTrace();
transaction.rollback();
} finally {
//em.close();
}
return test.getId();
}
public Test findById(Integer id) {
EntityManager em = EMgrUtil.getEntityManager();
Test t = em.find(Test.class, id);
return t;
}
public List<Test> findAll() {
EntityManager em = EMgrUtil.getEntityManager();
List<Test> list = em.createQuery("SELECT t FROM Test t", Test.class).getResultList();
return list;
}
}
我也尝试通过 PersistenceContext 注入 EntityManager 但它不起作用
主要
public class testDAO_test {
public static void main(String[] args) {
TestDAO testDAO = new TestDAO();
List<Test> tests = testDAO.findAll();
for(Test test : tests) {
System.out.println(test);
}
//Test test = testDAO.findById(2);
//System.out.println(test);
}
}
persistence.xml
<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="Services" transaction-type="RESOURCE_LOCAL">
<description>
Maven Test JPA
</description>
<!--provider>org.hibernate.ejb.HibernatePersistence</provider-->
<class>com.spring_test2.jpa.models.Test</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/spring_test2" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="pwd" />
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
【问题讨论】:
-
哪个类的哪一行提高了
nullPointerException? -
您的实体管理器为空
-
您是否也通过 ID 查找 NPE?
-
“但是怎么了”?这就是为什么你有一个调试器,不是吗?
-
请查看 Stack Overflow 的帮助文章How to create a Minimal, Complete, and Verifiable example。
标签: java unit-testing jpa jakarta-ee entitymanager