entitymanager.persist没有任何效果

bweufnob  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(635)

我正在使用javaee开发一个api(jaxrs),并尝试实现jpa。为此,据我所知,我正在使用eclipselink,我的应用程序部署在payara服务器上。
当我尝试使用entitymanager的persist方法时,没有发生任何事情,没有错误消息或其他东西。
这是我的道课:

  1. package shareloc.model.dao;
  2. import javax.persistence.*;
  3. import javax.persistence.criteria.CriteriaBuilder;
  4. import javax.persistence.criteria.CriteriaQuery;
  5. import javax.persistence.criteria.Root;
  6. import java.util.List;
  7. import java.util.Optional;
  8. import static shareloc.ServletContextListenerImpl.createEntityManager;
  9. public abstract class DAO<T> {
  10. @PersistenceContext(unitName = "MariaDB")
  11. protected EntityManager em;
  12. private Class<T> entityClass;
  13. public DAO(Class<T> entityClass) {
  14. this.entityClass = entityClass;
  15. this.em = getEntityManager();
  16. }
  17. private EntityManager getEntityManager() {
  18. if (em == null) {
  19. em = createEntityManager();
  20. }
  21. return em;
  22. }
  23. public T create(T entity) {
  24. em.persist(entity);
  25. return entity;
  26. }
  27. public void update(T entity) {
  28. em.merge(entity);
  29. }
  30. public void delete(T entity) {
  31. em.remove(em.merge(entity));
  32. }
  33. public Optional<T> findById(Object id) {
  34. return Optional.ofNullable(em.find(entityClass, id));
  35. }
  36. public List<T> findAll() {
  37. CriteriaBuilder cb = em.getCriteriaBuilder();
  38. CriteriaQuery<T> cq = cb.createQuery(entityClass);
  39. Root<T> root = cq.from(entityClass);
  40. cq.select(root);
  41. return em.createQuery(cq).getResultList();
  42. }
  43. }

ejb用户:

  1. package shareloc.ejb;
  2. import javax.persistence.*;
  3. @Entity
  4. @Table(name = "user")
  5. public class User {
  6. @Id
  7. @GeneratedValue(strategy = GenerationType.IDENTITY)
  8. @Column(name = "user_id")
  9. private int userId;
  10. @Column(name = "pseudo")
  11. private String pseudo;
  12. @Column(name = "email")
  13. private String email;
  14. @Column(name = "password")
  15. private String password;
  16. @Column(name = "firstname")
  17. private String firstname;
  18. @Column(name = "lastname")
  19. private String lastname;
  20. public User() {}
  21. public User(String pseudo, String email, String password, String firstname, String lastname) {
  22. this.pseudo = pseudo;
  23. this.email = email;
  24. this.password = password;
  25. this.firstname = firstname;
  26. this.lastname = lastname;
  27. }
  28. public User(int userId, String pseudo, String email, String password, String firstname, String lastname) {
  29. this.userId = userId;
  30. this.pseudo = pseudo;
  31. this.email = email;
  32. this.password = password;
  33. this.firstname = firstname;
  34. this.lastname = lastname;
  35. }
  36. public int getUserId() {
  37. return userId;
  38. }
  39. public void setUserId(int userId) {
  40. this.userId = userId;
  41. }
  42. public String getPseudo() {
  43. return pseudo;
  44. }
  45. public void setPseudo(String pseudo) {
  46. this.pseudo = pseudo;
  47. }
  48. public String getEmail() {
  49. return email;
  50. }
  51. public void setEmail(String email) {
  52. this.email = email;
  53. }
  54. public String getPassword() {
  55. return password;
  56. }
  57. public void setPassword(String password) {
  58. this.password = password;
  59. }
  60. public String getFirstname() {
  61. return firstname;
  62. }
  63. public void setFirstname(String firstname) {
  64. this.firstname = firstname;
  65. }
  66. public String getLastname() {
  67. return lastname;
  68. }
  69. public void setLastname(String lastname) {
  70. this.lastname = lastname;
  71. }
  72. }

调用dao create方法的方法:

  1. public static HashMap<String, String> register(String email, String pseudo, String password, String firstname, String lastname) {
  2. HashMap<String, String> formError = new HashMap<>();
  3. formError.putAll(checkEmail(email));
  4. formError.putAll(checkPassword(password));
  5. formError.putAll(checkPseudo(pseudo));
  6. formError.putAll(checkFirstname(firstname));
  7. formError.putAll(checkLastname(lastname));
  8. if (formError.isEmpty()) {
  9. System.out.println("form error empty test");
  10. userDAO.create(new User(pseudo, email, password, firstname, lastname));
  11. }
  12. return formError;
  13. }

身份验证根目录:

  1. @POST
  2. @Path("register")
  3. @Produces(MediaType.APPLICATION_JSON)
  4. public Response register(@QueryParam("email") String email, @QueryParam("pseudo") String pseudo,
  5. @QueryParam("password") String password, @QueryParam("firstname") String firstname,
  6. @QueryParam("lastname") String lastname) {
  7. HashMap<String, String> errorMsgs = AuthManager.register(email, pseudo, password, firstname, lastname);
  8. if (errorMsgs.isEmpty()) {
  9. return Response.ok().build();
  10. } else {
  11. GenericEntity<HashMap<String, String>> entity =
  12. new GenericEntity<>(errorMsgs) {};
  13. return Response.status(Response.Status.BAD_REQUEST).entity(entity).build();
  14. }
  15. }

servletcontextlistener将创建一个用于销毁em工厂的

  1. @WebListener
  2. public class ServletContextListenerImpl implements ServletContextListener {
  3. private static EntityManagerFactory emf;
  4. // Application start-up
  5. @Override
  6. public void contextInitialized(ServletContextEvent sce) {
  7. emf = Persistence.createEntityManagerFactory("MariaDB");
  8. }
  9. // Application destroyed
  10. @Override
  11. public void contextDestroyed(ServletContextEvent sce) {
  12. emf.close();
  13. }
  14. public static EntityManager createEntityManager() {
  15. if (emf == null)
  16. throw new NullPointerException("Context is not initialized yet.");
  17. return emf.createEntityManager();
  18. }
  19. }

pom.xml文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>fr.unistra.iutrs</groupId>
  7. <artifactId>ShareLoc-API</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <name>ShareLoc-API</name>
  10. <packaging>war</packaging>
  11. <properties>
  12. <maven.compiler.target>1.8</maven.compiler.target>
  13. <maven.compiler.source>1.8</maven.compiler.source>
  14. <junit.version>5.6.2</junit.version>
  15. </properties>
  16. <dependencies>
  17. <!-- https://mvnrepository.com/artifact/org.eclipse.persistence/org.eclipse.persistence.jpa -->
  18. <dependency>
  19. <groupId>org.eclipse.persistence</groupId>
  20. <artifactId>org.eclipse.persistence.jpa</artifactId>
  21. <version>3.0.0-M1</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>javax</groupId>
  25. <artifactId>javaee-api</artifactId>
  26. <version>8.0.1</version>
  27. <scope>provided</scope>
  28. </dependency>
  29. <dependency>
  30. <groupId>javax.mvc</groupId>
  31. <artifactId>javax.mvc-api</artifactId>
  32. <version>1.0.0</version>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.junit.jupiter</groupId>
  36. <artifactId>junit-jupiter-api</artifactId>
  37. <version>${junit.version}</version>
  38. <scope>test</scope>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.junit.jupiter</groupId>
  42. <artifactId>junit-jupiter-engine</artifactId>
  43. <version>${junit.version}</version>
  44. <scope>test</scope>
  45. </dependency>
  46. <!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
  47. <dependency>
  48. <groupId>org.mariadb.jdbc</groupId>
  49. <artifactId>mariadb-java-client</artifactId>
  50. <version>2.7.0</version>
  51. </dependency>
  52. <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
  53. <dependency>
  54. <groupId>javax.servlet</groupId>
  55. <artifactId>javax.servlet-api</artifactId>
  56. <version>4.0.1</version>
  57. <scope>provided</scope>
  58. </dependency>
  59. </dependencies>
  60. <build>
  61. <plugins>
  62. <plugin>
  63. <groupId>org.apache.maven.plugins</groupId>
  64. <artifactId>maven-war-plugin</artifactId>
  65. <version>3.3.0</version>
  66. </plugin>
  67. <plugin>
  68. <groupId>org.apache.maven.plugins</groupId>
  69. <artifactId>maven-compiler-plugin</artifactId>
  70. <configuration>
  71. <source>9</source>
  72. <target>9</target>
  73. </configuration>
  74. </plugin>
  75. </plugins>
  76. </build>
  77. </project>

持久性.xml:

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
  5. version="2.2">
  6. <persistence-unit name="MariaDB" transaction-type="JTA">
  7. <jta-data-source>java:global/mariadb</jta-data-source>
  8. <properties>
  9. <property name="javax.persistence.transactionType" value="JTA"/>
  10. <property name="javax.persistence.jdbc.driver" value="org.mariadb.jdbc.Driver" />
  11. <property name="javax.persistence.jdbc.url" value="jdbc:mariadb://mysql.iutrs.unistra.fr:3306/sharelocda" />
  12. <property name="javax.persistence.jdbc.user" value="" />
  13. <property name="javax.persistence.jdbc.password" value="" />
  14. <property name="eclipselink.target-database" value="MySQL"/>
  15. <property name="eclipselink.logging.level.sql" value="FINE"/>
  16. <property name="eclipselink.logging.parameters" value="true"/>
  17. </properties>
  18. </persistence-unit>
  19. </persistence>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <data-source>
  7. <name>java:global/mariadb</name>
  8. <class-name>org.mariadb.jdbc.MariaDbDataSource</class-name>
  9. <server-name>mysql.iutrs.unistra.fr</server-name>
  10. <port-number>3306</port-number>
  11. <database-name>sharelocda</database-name>
  12. <user></user>
  13. <password></password>
  14. </data-source>
  15. <listener>
  16. <listener-class>
  17. shareloc.ServletContextListenerImpl
  18. </listener-class>
  19. </listener>
  20. </web-app>

这是帕亚拉的日志:

  1. [2020-11-14T17:38:44.418+0100] [Payara 5.2020.5] [WARNING] [] [javax.enterprise.resource.resourceadapter.org.glassfish.jdbc.deployer] [tid: _ThreadID=125 _ThreadName=admin-thread-pool::admin-listener(1)] [timeMillis: 1605371924418] [levelValue: 900] [[
  2. Value of maxPoolSize Given, -1, was outside the bounds, default value of 32 will be used - PLEASE UPDATE YOUR VALUE]]
  3. [2020-11-14T17:38:44.419+0100] [Payara 5.2020.5] [WARNING] [] [javax.enterprise.resource.resourceadapter.org.glassfish.jdbc.deployer] [tid: _ThreadID=125 _ThreadName=admin-thread-pool::admin-listener(1)] [timeMillis: 1605371924419] [levelValue: 900] [[
  4. Value of steadyPoolSize Given, -1, was outside the bounds, default value of 8 will be used - PLEASE UPDATE YOUR VALUE]]
  5. [2020-11-14T17:38:44.499+0100] [Payara 5.2020.5] [INFO] [] [org.eclipse.persistence.session./file:/D:/Utilisateurs/razor/Documents/Etudes/IUT/IUT Robert Schuman/LP CDAD/LP1 - Développement Service Web/ShareLoc-API/target/ShareLoc-API-1.0-SNAPSHOT/WEB-INF/classes/_MariaDB] [tid: _ThreadID=125 _ThreadName=admin-thread-pool::admin-listener(1)] [timeMillis: 1605371924499] [levelValue: 800] [[
  6. EclipseLink, version: Eclipse Persistence Services - 2.7.7.payara-p2]]
  7. [2020-11-14T17:38:45.791+0100] [Payara 5.2020.5] [INFO] [] [fish.payara.micro.cdi.extension.ClusteredCDIEventBusImpl] [tid: _ThreadID=125 _ThreadName=admin-thread-pool::admin-listener(1)] [timeMillis: 1605371925791] [levelValue: 800] [[
  8. Clustered CDI Event bus initialized]]
  9. [2020-11-14T17:38:45.856+0100] [Payara 5.2020.5] [INFO] [] [org.glassfish.soteria.servlet.SamRegistrationInstaller] [tid: _ThreadID=125 _ThreadName=admin-thread-pool::admin-listener(1)] [timeMillis: 1605371925856] [levelValue: 800] [[
  10. Initializing Soteria 1.1-b01.payara-p5 for context '/ShareLoc-API-1.0-SNAPSHOT']]
  11. [2020-11-14T17:38:45.947+0100] [Payara 5.2020.5] [INFO] [jsf.config.listener.version] [javax.enterprise.resource.webcontainer.jsf.config] [tid: _ThreadID=125 _ThreadName=admin-thread-pool::admin-listener(1)] [timeMillis: 1605371925947] [levelValue: 800] [[
  12. Initializing Mojarra |version.string| for context '/ShareLoc-API-1.0-SNAPSHOT']]
  13. [2020-11-14T17:38:46.062+0100] [Payara 5.2020.5] [FINE] [] [org.eclipse.persistence.default] [tid: _ThreadID=125 _ThreadName=admin-thread-pool::admin-listener(1)] [timeMillis: 1605371926062] [levelValue: 500] [[
  14. SAXParserFactory instance: com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl@72289c40]]
  15. [2020-11-14T17:38:46.114+0100] [Payara 5.2020.5] [INFO] [AS-WEB-GLUE-00172] [javax.enterprise.web] [tid: _ThreadID=125 _ThreadName=admin-thread-pool::admin-listener(1)] [timeMillis: 1605371926114] [levelValue: 800] [[
  16. Loading application [ShareLoc-API-1.0-SNAPSHOT] at [/ShareLoc-API-1.0-SNAPSHOT]]]
  17. [2020-11-14T17:38:46.147+0100] [Payara 5.2020.5] [INFO] [] [javax.enterprise.system.core] [tid: _ThreadID=125 _ThreadName=admin-thread-pool::admin-listener(1)] [timeMillis: 1605371926147] [levelValue: 800] [[
  18. ShareLoc-API-1.0-SNAPSHOT was successfully deployed in 2 990 milliseconds.]]
  19. [2020-11-14T17:39:01.341+0100] [Payara 5.2020.5] [FINE] [] [org.eclipse.persistence.session./file:/D:/Utilisateurs/razor/Documents/Etudes/IUT/IUT Robert Schuman/LP CDAD/LP1 - Développement Service Web/ShareLoc-API/target/ShareLoc-API-1.0-SNAPSHOT/WEB-INF/classes/_MariaDB.sql] [tid: _ThreadID=111 _ThreadName=http-thread-pool::http-listener-1(4)] [timeMillis: 1605371941341] [levelValue: 500] [[
  20. SELECT user_id, email, firstname, lastname, password, pseudo FROM user WHERE (email = ?)
  21. bind => [test@gmail.fr]]]
  22. [2020-11-14T17:39:01.429+0100] [Payara 5.2020.5] [INFO] [] [] [tid: _ThreadID=111 _ThreadName=http-thread-pool::http-listener-1(4)] [timeMillis: 1605371941429] [levelValue: 800] [[
  23. form error empty test]]

所以,没有例外,没有什么可以解释我做错了什么。在询问之前,我在网上查了一下,发现有人也有同样的问题,但没有解决办法。。。
如果有人能解决我的问题,我会很高兴的(因为天哪,我在学习java之后遇到了很多问题(哈哈)如果你需要更多的信息或代码,请告诉我!谢谢!
编辑

  1. public class AuthManager {
  2. private static UserDAO userDAO = new UserDAO(); // I'm calling my DAO with this.
  3. public static HashMap<String, String> register(String email, String pseudo, String password, String firstname, String lastname) {
  4. HashMap<String, String> formError = new HashMap<>();
  5. // Some check about the email, pseudo, etc..
  6. if (formError.isEmpty()) {
  7. System.out.println("form error empty test");
  8. userDAO.create(new User(pseudo, email, password, firstname, lastname)); // That the create method from the DAO wihch only do a em.persist
  9. }
  10. return formError;
  11. }

下面是我的userdao类:

  1. public class UserDAO extends DAO<User> {
  2. public UserDAO() {
  3. super(User.class);
  4. }
  5. @Transactional
  6. public Optional<User> findByEmail(String email) {
  7. User user;
  8. Query query = em.createQuery("SELECT u FROM User u WHERE u.email = :email");
  9. query.setParameter("email", email);
  10. try {
  11. user = (User) query.getSingleResult();
  12. return Optional.of(user);
  13. } catch (NoResultException e) {
  14. return Optional.empty();
  15. }
  16. }
  17. }

还有刀:

  1. public abstract class DAO<T> {
  2. @PersistenceContext(unitName = "MariaDB")
  3. protected EntityManager em;
  4. private Class<T> entityClass;
  5. public DAO(Class<T> entityClass) {
  6. this.entityClass = entityClass;
  7. }
  8. @Transactional
  9. public T create(T entity) {
  10. em.persist(entity);
  11. return entity;
  12. }
  13. // + update, findAll, etc...
esbemjvw

esbemjvw1#

我很困惑。您已经将持久性单元配置为指向由容器管理的数据源( java:global/mariadb )还配置了jdbc属性?您必须下定决心,要么使用容器提供的数据源,要么自己配置它,但不能同时使用两者(换句话说,即 jta-data-source 属性与 javax.persistence.jdbc.* 属性)。
得到这个错误是因为您将持久性单元设置为使用jta,然后您试图在某个地方使用jta开始事务 em.getTransaction() ,这是jta不允许的。还有,你把 @PersistenceContext 在…之上 entityManager ,这意味着在调用构造函数之后 entityManager 很可能被注入的示例覆盖。
解决方案是,假设您确实想要使用jta,注入 EntityManager 使用 @PersistenceContext (您不必手动初始化它),然后注解您希望以原子方式执行的方法 @Transactional ,而不是试图使用 entityManager.getTransaction() .

相关问题