有一段时间我一直在想为什么在使用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删除的方法和原因.
我想知道它们之间的真正区别是什么em.detach(entity),em.remove(entity)并使用如下JPQL请求:
em.createQuery("DELETE FROM Country").exceuteUpdate();
Run Code Online (Sandbox Code Playgroud)
谢谢.
我想在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)
但它不如注射方便.
如果有任何相关的教程,那将是很棒的.无论如何,谢谢你的帮助!
一些令人困惑的解释:flush(); 刷新是将底层持久存储与内存中保持的持久状态同步的过程.它将在正在运行的事务中更新或插入到表中,但它可能不会提交这些更改.
如果只有在提交之后才会在数据库中保留更改,那么为什么要在代码中间进行刷新.
并且在运行刷新之后,如果对托管对象进行了任何更改,那么将抛出异常,或者这些将被同步,然后将变为永久.如果他们得到同步,那么为什么要在第一时间冲洗.
我在我的eclipse中导入了一个app引擎项目.它在我之前的笔记本电脑上运行正常,这里我已经从我的旧机器复制了eclipse目录并将项目导入其中.现在我看到一个错误"java.lang.NoClassDefFoundError:无法初始化类sharepro.java.dao.EMFService".该错误符合"EntityManager em = EMFService.get().createEntityManager();".我添加了所有的罐子.任何关于whcih jar的指针我正在酝酿或任何conf问题?
谢谢和问候Sundi
在我的项目中,我忘了关闭每个操作的实体管理器.一段时间后,由于与mysql服务器的连接过多,我得到了异常.这是否意味着每个实体经理建立连接?当我们忘记关闭连接时会发生什么?我只使用了一个实体经理工厂.
有没有办法使用findAll()条件的功能?
我想做点什么
->findAll('active'=1);
Run Code Online (Sandbox Code Playgroud)
我知道我可以编写自定义存储库类,但只是为了一个简单的"where-condition"我认为有一种更简单的方法.
我是一个Java EE/EJB noob,但是从我收集的文档和其他帖子中,您无法在实体验证期间使用相同的entitymanager/session查询数据库.
通常,可移植应用程序的生命周期方法不应调用EntityManager或Query操作,访问其他实体实例或修改同一持久化上下文中的关系.[43] 生命周期回调方法可以修改调用它的实体的非关系状态.
翻译好吗?
这很抽象......可以用更具体的术语来解释吗?它导致的问题多于答案.例如,如果我的实体有一个延迟加载的集合,我可以在验证期间访问它吗?该集合是"另一个实体",需要数据库查询,这似乎违反了文档.
这种"生命周期要求"似乎很奇怪,因为某些验证确实需要查询数据库才是生活中的事实.
从其他帖子我也看到人们通过使用entitymanagerfactory创建一个新的entitymanager/session来解决这个查询问题.
这引出了两个关于使用EntityManagers和Hibernate验证的问题:
我尝试过这样的事情:
@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的一般模式是什么?
谢谢!
现在我正在创建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节使用.但是后来我只能传递一些属性,但是我可以以某种方式添加带注释的类吗?
我正在尝试使用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能够识别它?