Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何摆脱em.persist();_Java_Hibernate_Spring Transactions - Fatal编程技术网

Java 如何摆脱em.persist();

Java 如何摆脱em.persist();,java,hibernate,spring-transactions,Java,Hibernate,Spring Transactions,我再也不喜欢写了。persist()了。我可以在返回新实例时执行此操作吗 嗯,也许我会和grails域混淆 在示例中,我得到了一个AppConfig.java: package spring; import org.springframework.context.annotation.*; import org.springframework.orm.jpa.*; import org.springframework.transaction.PlatformTransactionManager;

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

嗯,也许我会和grails域混淆

在示例中,我得到了一个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; }

}
persistence.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>

假的
org.hsqldb.jdbcDriver
创建下降
jdbc:hsqldb:mem:jamsession
sa
org.hibernate.dialogue.hsql方言
假的
真的
假的
名为Test的控制器:

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();
    }
}
封装弹簧;
导入java.util.List;
导入javax.persistence.EntityManager;
导入javax.persistence.PersistenceContext;
导入org.springframework.stereotype.Controller;
导入org.springframework.transaction.annotation.Transactional;
@控制器
公开课考试{
@持久上下文
瞬态实体管理器;
@交易的
公共用户newUser(字符串名称){
用户=新用户();
user.setName(name);
//em.persist(用户);
返回用户;
}
公共列表getUsers(){
返回em.createQuery(“来自用户”).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?

如果您想使用hibernate在数据库中存储用户域对象,只需调用
em.persist(user)
即可。在数据访问层封装持久性操作被认为是一种良好的做法。数据访问层使用
EntityManager
执行常见的持久性操作,如保存、查找、删除、列表、计数等,并使用
EntityManager
封装操作。上面的数据访问层应该是事务性服务层,它提供与应用程序相关的业务方法,例如
UserService
方法
createUserAccount
——服务层调用数据访问层来执行基本操作(例如,在事务内部保存用户并为其分配一些安全角色)。最后,应用程序中的控制器应仅与服务层通信-通过这种方式,您可以从低级ORM API中提取。

如果要使用hibernate将用户域对象存储在数据库中,只需调用
em.persist(user)
somewhere。在数据访问层中封装持久性操作被认为是一种良好的做法。数据访问层使用
EntityManager
执行常见的持久性操作,如保存、查找、删除、列表、计数等,并使用
EntityManager
封装操作。上面的数据访问层应该是事务性服务层,它提供与应用程序相关的业务方法,例如
UserService
方法
createUserAccount
——服务层调用数据访问层来执行基本操作(例如,在事务内部保存用户并为其分配一些安全角色)。最后,应用程序中的控制器应仅与服务层通信-这样您就可以从低级ORM API中抽象出来。

您可以使用
AOP
摆脱
em.persist
:)您可以为自己做一个注释,在执行函数后,对它返回的任何内容执行
em.persist()

你可以:

  • 在JavaEE的情况下编写一个拦截器
  • 如果使用spring,请使用或AOP
  • 使用一些
    DAO
    s来操作对象
  • 如果您使用的是spring,那么使用AOP要容易得多。。。只需谷歌它的AOP和发明任何你想要的

    您也可以使用
    弹簧数据
    。。。给你很多东西。。。只要写一个接口,你就完成了<代码>spring数据将实现您的接口

    在这里您可以看到一个
    spring数据
    项目


  • 附言:这不是开玩笑。。。您不必为该接口编写任何实现。。。您只需使用命名约定,如“
    save()
    findUserByName(字符串名)
    ”等

    您可以使用
    AOP
    :)摆脱
    em.persist
    ),您可以在执行函数后对自己做一个注释,对它返回的任何内容执行
    em.persist()
    。)

    你可以:

  • 在JavaEE的情况下编写一个拦截器
  • 如果使用spring,请使用或AOP
  • 使用一些
    DAO
    s来操作对象
  • 如果您使用的是spring,那么使用AOP要容易得多。。。只需谷歌它的AOP和发明任何你想要的

    您也可以使用
    弹簧数据
    。。。给你很多东西。。。只要写一个接口,你就完成了<代码>spring数据将实现您的接口

    在这里您可以看到一个
    spring数据
    项目


  • 附言:这不是开玩笑。。。您不必为该接口编写任何实现。。。您只需使用命名约定,如“
    save()
    findUserByName(字符串名)
    ”等

    实现这一点的一种方法是使用根对象中的。在您的情况下,可能
    用户
    属于
    部门
    。您可以将类a
    @OneToMany
    映射到
    User
    ,标记为
    CascadeType。所有

    @Entity
    public class Department {
        @OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
        private Set<User> users;
    }
    
    提交封闭事务时,将保存现有但已修改的
    部门
    ,保存操作也将级联到新的
    用户

    如果没有
    用户
    的自然聚合,例如
    部门
    ,则可以为所有用户创建一个主根对象。或者您可以将用户分为不同的类型(administra)
    Department d = em.find(Department.class, "Coinage");
    User u = new User("Felix Schlag");
    d.addUser(u);