伙计们,简单地说,我有一个带有文本输出框的java应用程序.我想查询Db并将输出显示到文本框中.
示例我有一个带有两列food
和的Dbcolor
我想 :
SELECT * in Table WHERE color = 'blue'
Run Code Online (Sandbox Code Playgroud)
有什么建议?
如果我有多个线程,每个使用注入器来获取EntityManager对象,每个使用em对象来选择其他类对象的列表.准备用于for循环.
如果一个线程首先完成并调用clear(),那会影响其他线程吗?喜欢for循环会有异常吗?
close()怎么样?
如果答案是"它取决于",那么(类定义?方法调用?)和where(java code?annotation?xml?)应该看看它是如何依赖的?
我没有写源,我只是在没有文档的情况下使用其他人的库.
谢谢.
我正在使用Java EE 7.我想知道将JPA EntityManager
注入应用程序范围的 CDI bean 的正确方法是什么.您不能只使用@PersistanceContext
注释注入它,因为EntityManager
实例不是线程安全的.假设我们希望EntityManager
在每个HTTP请求处理的开始时创建我们,并在处理HTTP请求后关闭它们.我想到了两个选择:
1.创建一个请求范围的CDI bean,它具有对a的引用EntityManager
,然后将bean注入到应用程序范围的CDI bean中.
import javax.enterprise.context.RequestScoped;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@RequestScoped
public class RequestScopedBean {
@PersistenceContext
private EntityManager entityManager;
public EntityManager getEntityManager() {
return entityManager;
}
}
Run Code Online (Sandbox Code Playgroud)
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
@ApplicationScoped
public class ApplicationScopedBean {
@Inject
private RequestScopedBean requestScopedBean;
public void persistEntity(Object entity) {
requestScopedBean.getEntityManager().persist(entity);
}
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,EntityManager
将在创建时RequestScopedBean
创建,并在RequestScopedBean
销毁时关闭.现在我可以将注入移动到一些抽象类中以将其从中删除ApplicationScopedBean
.
2.创建一个生成实例的生产者,EntityManager
然后将EntityManager
实例注入到应用程序范围的CDI bean中.
import …
Run Code Online (Sandbox Code Playgroud) 当我调用刷新函数时,我从我的EntityManager收到此错误.
public void saveProduct(Product product) {
entityManager.refresh(product);
}
Run Code Online (Sandbox Code Playgroud)
我听说这可能是Spring/Hibernate的一个错误,但是我不知道如何解决这个问题.
编辑:错误是
java.lang.IllegalArgumentException: Entity not managed
org.hibernate.ejb.AbstractEntityManagerImpl.refresh(AbstractEntityManagerImpl.java:268)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:358)
$Proxy17.refresh(Unknown Source)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:198)
$Proxy11.refresh(Unknown Source)
springapp.repository.JdbcProductDao.saveProduct(JdbcProductDao.java:66)
springapp.service.SimpleProductManager.increasePrice(SimpleProductManager.java:28)
springapp.web.PriceIncreaseFormController.onSubmit(PriceIncreaseFormController.java:39)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:421)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:136)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:326)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:313)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
Run Code Online (Sandbox Code Playgroud) 我有我想要加载的实体,以及其他ocassions懒惰(甚至是额外的懒惰)加载.
我的映射没有在我的YAML中声明的获取模式 - 因此它们使用默认值(延迟加载).
目前,热切加载的唯一方法是手动构建DQL - 每次添加新实体时我都需要更新它.
理想情况下,我只是加载根实体和强制加载所有关联对象的力.有什么方法可以做到这一点吗?
如果不是为什么(是否有一个原因超出它是一个未实现的功能)?
实现简单更新的标准方法是什么?
示例:我们的用户电话号码为NNNNNN,现在我们要将其设置为YYYYYY.
@PersistenceContext
private EntityManager em;
public void update (User transientUser) {
what should be here?
}
Run Code Online (Sandbox Code Playgroud)
用户实体尽可能简单:
@Entity
@Table (name = "USER")
public class User {
@Id
@GeneratedValue
private Integer id;
@Column (nullable = false, unique = true)
private String login;
private String phone;
public User () { }
... //some setters and getters
}
Run Code Online (Sandbox Code Playgroud) 我目前在理解JPA的概念时遇到了问题.
我目前正在使用/开发最近的EclipseLink,Glassfish,Derby数据库来演示一个项目.
在我开发更大的图片之前,我需要绝对确定这个PersistingUnit如何在不同的范围内工作.
我有一堆servlet 3.0,目前在request.session对象中保存用户的相关实体类(同一个war文件中的所有内容).我目前正在使用EntityManagerFactory和UserTransaction注入的应用程序管理的EntityManager.它在我自己测试时运行顺畅.当2个人同时访问相同的实体时,会发生不同版本的实体.我希望使用托管bean跨越相同的WAR,如果可能的话,使用相同的持久性单元.
我已经阅读了http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html以及那些对我来说根本没有意义的范围的解释.
简而言之,应用程序和容器管理的EntityManagers的用途和区别是什么?
我正在学习JPA并且有一个问题:
在哪些情况下EntityManager
,我们的应用程序需要多个?
我所知道的两种情况如下:
当我们的应用程序是一个多线程应用程序并且多个线程需要JPA事务时,因为EntityManager
它不是线程安全的,我们需要EntityManager
每个线程一个.
当任何线程需要多个并发事务时,我们EntityManager
在该线程中需要多个,因为EntityManager
和之间存在一对一的关系EntityTransaction
.
Q1.当我们需要不止一个时,还有其他情况EntityManager
吗?
Q2.根据我的理解,EntityManagerFactory
每个Persitence单位应该只有一个.我对么?如果没有,那么当EntityManagerFactory
每个持久性单元需要多个时,那些情况是什么?
我的问题是为什么冲洗不起作用:
public void ejbService(){
Customer c = em.find(Customer.class,1);
c.setName("newName");
em.flush();
//at this point when I query mysql table I can not see "newName"
thread.sleep(10000);
c.setName("anotherName");
}
Run Code Online (Sandbox Code Playgroud)
完成方法后,我在db中看到"anotherName",我也用em.find(Customer.class,1,Lock.None)检查它; 但仍然不行
RGDS
我正在寻找一种从JPA实体创建数据传输对象(DTO)的好方法,反之亦然.我想将DTO作为JSON发送到客户端,然后接收修改后的DTO并将其保存回数据库.在从JSON解析为Java类之后,从接收到的对象上的EntityManager执行合并方法将是最容易的.
例如,有以下Entity和Rest方法用于保存修改后的对象:
@Entity
@Table(name="CUSTOMER")
public class Customer {
@Id
Long id;
@Version
Long version;
String name;
String address;
String login;
String password;
String creditCardNumber;
@OneToMany(cascade = CascadeType.ALL)
List<Foo> fooList;
... Getter() and Setter()
}
Run Code Online (Sandbox Code Playgroud)
private EntityManager em;
@POST
@Path("/saveCustomer")
public void saveCustomer ( Customer customer) {
em.merge(customer);
return;
}
Run Code Online (Sandbox Code Playgroud)
只要我将整个实体类作为JSON发送并接收整个实体,这样就可以正常工作.然后,EntityManager将修改后的对象合并到数据库中.但是当我只想提供实体的一个子集(比如只有客户的名称和地址)时,会出现问题:
创建实体子集的最佳方法是什么?
- 手工编写实体的DTO?这将为实体的每个子集生成重复的代码,必须对其进行维护.
如何将作为实体子集的DTO合并回数据库?
- 使用EntityManager的merge()方法不起作用.起初,DTO不是实体,因此无法合并.只需从DTO创建实体,实体中就会有一些未设置的值.合并后,数据库中的值将为NULL.
我想出的一个想法是为我想要为实体指定的每个子集指定其他实体.(就像数据库视图一样)这将是重复的代码,但它可以解决DTO与数据库合并的问题.(也许这段代码可以自动生成)
例如,实体CustomerView1链接到与Customer类相同的表,但仅提供客户的名称和地址.它是真正的Customer类的DTO,可以作为JSON发送并在服务器外部进行修改.然后,该类也可以由EntityManager合并到数据库.
@Entity
@Table(name="CUSTOMER")
public class CustomerView1 {
@Id
Long id;
@Version
Long version;
String name;
String address;
... Getter() and Setter() …
Run Code Online (Sandbox Code Playgroud) entitymanager ×10
java ×8
jpa ×7
orm ×2
cdi ×1
database ×1
datamapper ×1
doctrine ×1
doctrine-orm ×1
dto ×1
hibernate ×1
java-ee ×1
java-ee-7 ×1
mysql ×1
persistence ×1
spring ×1
transactions ×1