标签: entitymanager

使用JPA entityManager时,为什么在删除之前必须合并?

有一段时间我一直在想为什么在使用JPA时,我是否必须编写我的删除方法:

@Transactional
public void delete(Account account)
{
    if (entityManager.contains(account))
    {
        entityManager.remove(account);
    }
    else
    {
        entityManager.remove(entityManager.merge(account));
    }
}
Run Code Online (Sandbox Code Playgroud)

也许不需要包含,因为事务以此方法开始和结束,但我仍然想知道为什么删除不能只是取一个非托管对象.是因为需要对其进行管理才能知道该对象的id是什么?任何其他见解都会很棒.我只是想了解JPA删除的方法和原因.

merge jpa entitymanager jpa-2.0

9
推荐指数
1
解决办法
6379
查看次数

'detach'和'remove'entityManager的方法之间的区别

我想知道它们之间的真正区别是什么em.detach(entity),em.remove(entity)并使用如下JPQL请求:

em.createQuery("DELETE FROM Country").exceuteUpdate();
Run Code Online (Sandbox Code Playgroud)

谢谢.

jpa entitymanager jpql

9
推荐指数
1
解决办法
1万
查看次数

在Java SE中使用CDI和JPA的最简单方法是什么?

我想在Java SE中使用

@Stateless
public class CarDAO {
    @Inject
    private EntityManager em;

    public Car findById(Long id) {
        return em.find(Car.class, id);
    }
}

@Singleton
public class Application {
    @Inject
    private CarDAO carDAO;

    public void run() {
        Car car = carDAO.findById(44);
        System.out.println(car);
    }
}

public class EntryPoint {
    public static void main(String[] args) {
        Application application = // missing code
        application.run();
    }
}
Run Code Online (Sandbox Code Playgroud)

我必须做些什么才能实现这一目标?我在我的项目中使用postgres数据库和maven.

我已经读过一些关于Weld的内容(但它看起来只有CDI).我不知道如何添加到Weld possibilty来注入实体管理器.我知道我可以获得实体经理

EntityManagerFactory emf = Persistence.createEntityManagerFactory("mgr");
EntityManager em = emf.createEntityManager();
Run Code Online (Sandbox Code Playgroud)

但它不如注射方便.

如果有任何相关的教程,那将是很棒的.无论如何,谢谢你的帮助!

java jpa entitymanager cdi

9
推荐指数
1
解决办法
1万
查看次数

JPA中冲洗的确切目的是什么

一些令人困惑的解释:flush(); 刷新是将底层持久存储与内存中保持的持久状态同步的过程.它将在正在运行的事务中更新或插入到表中,但它可能不会提交这些更改.

如果只有在提交之后才会在数据库中保留更改,那么为什么要在代码中间进行刷新.

并且在运行刷新之后,如果对托管对象进行了任何更改,那么将抛出异常,或者这些将被同步,然后将变为永久.如果他们得到同步,那么为什么要在第一时间冲洗.

java jpa entitymanager

9
推荐指数
1
解决办法
1万
查看次数

NoClassDefFoundError无法初始化类EMFService

我在我的eclipse中导入了一个app引擎项目.它在我之前的笔记本电脑上运行正常,这里我已经从我的旧机器复制了eclipse目录并将项目导入其中.现在我看到一个错误"java.lang.NoClassDefFoundError:无法初始化类sharepro.java.dao.EMFService".该错误符合"EntityManager em = EMFService.get().createEntityManager();".我添加了所有的罐子.任何关于whcih jar的指针我正在酝酿或任何conf问题?

谢谢和问候Sundi

google-app-engine entitymanager

8
推荐指数
1
解决办法
2101
查看次数

实体管理器是否创建了与数据库的连接?

在我的项目中,我忘了关闭每个操作的实体管理器.一段时间后,由于与mysql服务器的连接过多,我得到了异常.这是否意味着每个实体经理建立连接?当我们忘记关闭连接时会发生什么?我只使用了一个实体经理工厂.

entitymanager jpa-2.0

8
推荐指数
1
解决办法
2万
查看次数

在symfony2中查找所有条件

有没有办法使用findAll()条件的功能?

我想做点什么

->findAll('active'=1);
Run Code Online (Sandbox Code Playgroud)

我知道我可以编写自定义存储库类,但只是为了一个简单的"where-condition"我认为有一种更简单的方法.

repository entitymanager findall symfony

8
推荐指数
1
解决办法
1万
查看次数

在Hibernate验证期间执行EntityManager查询的正确方法

我是一个Java EE/EJB noob,但是从我收集的文档和其他帖子中,您无法在实体验证期间使用相同的entitymanager/session查询数据库.

通常,可移植应用程序的生命周期方法不应调用EntityManager或Query操作,访问其他实体实例或修改同一持久化上下文中的关系.[43] 生命周期回调方法可以修改调用它的实体的非关系状态.

翻译好吗?

这很抽象......可以用更具体的术语来解释吗?它导致的问题多于答案.例如,如果我的实体有一个延迟加载的集合,我可以在验证期间访问它吗?该集合是"另一个实体",需要数据库查询,这似乎违反了文档.

这种"生命周期要求"似乎很奇怪,因为某些验证确实需要查询数据库才是生活中的事实.

从其他帖子我也看到人们通过使用entitymanagerfactory创建一个新的entitymanager/session来解决这个查询问题.

这引出了两个关于使用EntityManagers和Hibernate验证的问题:

  1. 是否有可能出现某种设计缺陷或滥用Hibernate验证,因为我需要在验证期间查询数据库?
  2. 鉴于我在JBoss中使用Java EE,如何使用EntityManagerFactory注入验证器?

我尝试过这样的事情:

@Stateless
public class UserValidator implements ConstraintValidator<ValidUser, User> {
    @PersistenceUnit(unitName="blahblah")
    EntityManagerFactory emf;

    ...
}
Run Code Online (Sandbox Code Playgroud)

但EMF永远不会注入.我猜测@Stateless标签变得无关紧要,因为我正在实现一个ConstraintValidator接口,这是Hibernate Validator工作所需要的.

那么从Validator获取EntityManagerFactory的一般模式是什么?

谢谢!

hibernate entitymanager java-ee hibernate-validator

8
推荐指数
1
解决办法
3726
查看次数

使用带注释的类以编程方式(不带persistence.xml文件)创建EntityManagerFactory

现在我正在创建EntityManagerFactory这样的:

    Map<String, String> properties = ImmutableMap.<String, String>builder()
        .put(DRIVER, "com.mysql.jdbc.Driver")
        .put(DIALECT, "org.hibernate.dialect.MySQL5Dialect");
        .put(USER, dbUsername)
        .put(PASS, dbPassword)
        .put(URL, dbConnectionUrl)
        //Some more properties
        .build();

    Ejb3Configuration cfg = new Ejb3Configuration();

    cfg.configure(properties);

    cfg.addAnnotatedClass(AuditEntry.class);
    cfg.addAnnotatedClass(LastWrittenEventId.class);
    //Some more annotated classes

    return cfg.createEntityManagerFactory();
Run Code Online (Sandbox Code Playgroud)

但是正如我在javadocs中看到的那样,Ejb3Configuration不推荐使用它,我不应该使用它.我应该Persistence.createEntityManagerFactory()按照JPA规范 7.3节使用.但是后来我只能传递一些属性,但是我可以以某种方式添加带注释的类吗?

hibernate entitymanager

8
推荐指数
1
解决办法
2329
查看次数

在@ConstructorResult的情况下放置@SqlResultSetMapping的位置

我正在尝试使用jpa的entityManager的createNativeQuery方法映射非实体pojo.通过使用这样的东西

@SqlResultSetMapping(name="ResultMapping", 
classes={
@ConstructorResult(
     targetClass=Employee.class,
       columns={
          @ColumnResult(name="empID", type=Long.class),
          @ColumnResult(name="empName", type=String.class),
          }
   )
}
)
public class Loader{
 private EntityManager em;

 public void load(){

   Query query = em.createNativeQuery("select empID, empName from employee",  "ResultMapping");
   List<Employee> = query.getResultList();
 }

}

public class Employee{

 private long empID;
 private String empName;
 public Employee(long empid, String empname)
 {
     this.empID = empid;
     this.empName = empname;
 }
}
Run Code Online (Sandbox Code Playgroud)

我收到unknown SqlResultSetMapping ResultMapping错误我应该把SqlResultSetMapping放在哪里,以便entityManager能够识别它?

mapping jpa entitymanager

8
推荐指数
1
解决办法
9835
查看次数