java - 如何摆脱 em.persist();

标签 java hibernate spring-transactions

我不再喜欢写 em.persist() 了。我可以在返回新实例时执行此操作吗?

嗯,也许 id 与 grails-domains 混淆了。

在示例中,我有一个 AppConfig.java:

package spring;
import org.springframework.context.annotation.*;
import org.springframework.orm.jpa.*;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.*;

@Configuration
@EnableAspectJAutoProxy
@EnableTransactionManagement
public class AppConfig implements TransactionManagementConfigurer {

    @Bean
    public LocalEntityManagerFactoryBean entityManagerFactory() {
        LocalEntityManagerFactoryBean bean = new LocalEntityManagerFactoryBean();
        bean.setPersistenceUnitName("persistenceUnit");
        return bean;
    }

    @Bean
    @Scope("session")
    public Test test() {
        return new Test();
    }

    @Bean
    public JpaTransactionManager txManager() {
        return new JpaTransactionManager();
    }

    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return txManager();
    }
}

和实体用户

package spring;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity @Table(name = "User")
public class User {
    private long id;
    @Id
    @GeneratedValue
    public long getId() { return id; }
    public void setId(long id) { this.id = id; }


    private String name;
    @Column
    public void setName(String name) { this.name = name; }
    public String getName() { return name; }

}

持久化.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="persistenceUnit">
        <properties>
            <property name="hibernate.ejb.cfgfile" value="/META-INF/hibernate.cfg.xml" />
        </properties>
    </persistence-unit>
</persistence>

和 hibernate.cfg.xml

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory name="sessionFactory">
            <property name="hibernate.hbm2ddl.auto">false</property>
            <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
            <property name="hibernate.connection.password"></property>
            <property name="hibernate.hbm2ddl.auto">create-drop</property>
            <property name="hibernate.connection.url">jdbc:hsqldb:mem:jamsession</property>
            <property name="hibernate.connection.username">sa</property>
            <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
            <property name="hibernate.search.autoregister_listeners">false</property>
            <property name="hibernate.show_sql">true</property>
            <property name="hibernate.format_sql">false</property>
            <mapping class="spring.User" />
        </session-factory>
    </hibernate-configuration>

名为 Test 的 Controller :

package spring;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;

@Controller
public class Test {
    @PersistenceContext
    transient EntityManager em;

    @Transactional
    public User newUser(String name) {
        User user = new User();
        user.setName(name);
        // em.persist(user);
        return user;
    }

    public List<User> getUsers() {
        return em.createQuery("from User").getResultList();
    }
}

最后但并非最不重要的一点是,这个index.jsp:

<%@page import="spring.User"%>
<%@page import="spring.Test"%>
<%@page import="org.springframework.web.context.WebApplicationContext"%>
<%@page import="org.springframework.web.context.support.WebApplicationContextUtils"%>
<%
    WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
    Object o = wac.getBean("appConfig");
    Test test = (Test) wac.getBean("test");
    if (request.getParameter("insert") != null) {
        test.newUser(request.getParameter("name"));
    }
%>
<ol>
<% for (User u : test.getUsers()) {
     out.print("<li>"+u.getName()+"</li>");
   } %>
</ol>

<form method="post">
  <input type="text" name="name" value="unnamed" />
  <input type="submit" value="Insert" name="insert" />
</form>

要使用插入按钮保存新用户,我需要 em.persist(user);!我怎样才能摆脱em.persist?

最佳答案

您可以使用AOP摆脱em.persist:)您可以自己做一个注释,在执行函数后执行em。 persist() 无论它返回什么:)..

你可以:

  1. 为 java ee 编写一个拦截器...
  2. 使用aspectj或 AOP(如果您使用 spring)
  3. 使用一些DAO来操作对象

如果你使用 Spring,使用 AOP 会容易得多...只需在 google 上搜索 AOP 并发明你想要的任何东西...

您还可以使用spring-data...为您提供很多东西...只需编写一个接口(interface)即可完成...spring-data > 将实现您的接口(interface)...

在这里你可以看到一个spring-data项目

  1. spring-data JPA
  2. an interface that will be implemented by spring (using AOP)

P.S:这不是一个笑话...您不必为该接口(interface)编写任何实现...您只需使用命名约定,例如“save()findUserByName(字符串名称)"等等...

关于java - 如何摆脱 em.persist();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15207765/

相关文章:

java - 如何在 Spring Boot 中将变量发送到 Controller 而不是作为表单输入

hibernate - 如何完全禁用Hibernate缓存? (在Spring 3中,带有注释的Hibernate)

java - order_updates 属性如何避免 Hibernate 中的死锁

java - 如何仅在之前未加载 bean 的情况下创建 bean 定义?

spring - 测试@TransactionalEvents和@Rollback

触发了 hibernate 实体拦截器但设置值不保存

java - 未创建 Android SQLite 数据库

java - Spring mvc项目中如何获取图片文件路径?

java - 如何将 HashMap<Integer, boolean[]> hashMap=new HashMap<Integer,boolean[]>() 存储和检索到 android 中的共享首选项中

hibernate - Grails Domain Binder.getMapping(Domain)对于Grails-3.2.4中的非持久性域返回null