我有@Statelessbean实现两个接口(远程和本地).我还添加@LocalBean了用于通过无接口视图访问bean的anotation.
@Stateless
@LocalBean
public class WeatherDataBean implements WeatherDataBeanRemote, WeatherDataBeanLocal {
@Inject
private EntityManager entityManager;
public WeatherDataBean () {
}
// ....attributes, getter & setter methods ....
}
Run Code Online (Sandbox Code Playgroud)
我使用@Inject这个原因取自JBoss AS7快速启动的这个例子:
我们使用来自CDI的"资源生成器"模式,将实体管理器的旧式@PersistenceContext注入"别名"为CDI样式注入.这允许我们在整个应用程序中使用一致的注入样式(@Inject).
以前我用过:
@PersistenceContext(unitName="WeatherStationJPA")
private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)
在EJB中,它没有任何问题.但是使用@Inject注释我得到这个错误:
WELD-001408在注入点[[field] @Inject private ejb.WeatherDataBean.entityManager]中带有限定符[@Default]的[EntityManager]类型的不满意依赖项
这是我如何定义类资源:
public class Resources {
@SuppressWarnings("unused")
@PersistenceContext(unitName="WeatherStationJPA")
@Produces
private EntityManager entityManager;
@Produces
FacesContext getFacesContext() {
return FacesContext.getCurrentInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试注入实体管理器,为什么会出现此错误?
编辑: 根据@LightGuard的请求,我正在添加我用来引用注释的包:
WeatherDataBean有:
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.inject.Inject; …Run Code Online (Sandbox Code Playgroud)dependency-injection stateless-session-bean entitymanager cdi java-ee-6
我有个问题.我尝试在没有控制器的情况下获得Entity-Manager,但我没有找到办法.这时,我得到了这样的Entity-Manager:
(Controller)
public function getEntityManager()
{
if (null === $this->_em) {
$this->_em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
}
return $this->_em;
}
(Plugin)
public function getEntityManager()
{
if($this->_em == null){
$this->_em = $this->getController()->getServiceLocator()->get('doctrine.entitymanager.orm_default');
}
return $this->_em;
}
Run Code Online (Sandbox Code Playgroud)
你看,我总是需要一个控制器.但是,如果我需要模型中的EntityManager,我有一个问题.我可以给模型控制器,但我认为这是一个糟糕的方式.
您是否有任何想法在没有控制器的情况下获取EntityManager?
我想知道这些方法之间的区别.
当使用EntityManager 的createQuery()和find()方法时?
他们每个人的优势是什么?
谢谢你的回答.
我正在使用JPA EntityManager来执行某些操作,并且一个此类操作正在将实体替换为具有相同实体的另一个实体@Id.那么,给定一个oldObject和一个newObject,什么是最好的方法来删除oldObject并替换它newObject?
这里有一些不起作用的代码:
try
{
entityManager.getTransaction().begin();
entityManager.remove(oldObject);
entityManager.persist(newObject);
entityManager.getTransaction().commit();
}
catch (PersistenceException persistExc)
{
entityManager.getTransaction().rollback();
// do some stuff
}
Run Code Online (Sandbox Code Playgroud)
此代码获得以下异常:
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.depressio.SomeObject
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1215)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1148)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1154)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:678)
Run Code Online (Sandbox Code Playgroud)
现在,它当然可行,如果不是删除实体,我只是更新其已更改的字段.但是,我只是被赋予了新的对象(UI通过REST将它扔给我),所以我真的不知道哪些字段已经改变,所以我必须更新每个字段.如果有大量的田地,那就不理想了.
我觉得我对如何正确删除有点困惑.我认为EntityManager.remove是正确的方式,但我猜不是.
提前致谢!
编辑1:我觉得我应该注意oldObject.id == newObject.id.在id通过产生@SequenceGenerator.如果标识符已经用生成器注释,我是否可以使用标识符来持久保存对象?
编辑2:根据这里最热门的答案,因为@Id已经定义了它并且它是一个自动生成的字段,Hibernate认为它已经分离了.现在我知道为什么我会得到例外,但解决方案仍然不清楚.
我正在努力更好地处理Spring的@Transactional属性.据我所知,它基本上包装了标记为@Transactional事务的方法的内容.将服务/业务层方法标记为事务性是否合适,而不是实际的DAO方法,就像我在这里所做的那样?
服务实施
public class UserServiceImpl implements UserServiceInt{
@Autowired
private UserServiceDAO serviceDAO;
@Override
public User getUser(int id){
return serviceDAO.getUser(id);
}
@Override
@Transactional
public void updateUserFirstName(int id, String firstName) throws SomeException{
User userToUpdate = getUser(id);
if(userToUpdate == null){
throw new SomeException("User does not exist");
}
userToUpdate.setFirstName(firstName);
serviceDAO.updateUser(userToUpdate);
}
}
Run Code Online (Sandbox Code Playgroud)
DAO实施
public class UserServiceDAOImpl implements UserServiceDAOInt{
@PersistenceContext(unitName="myUnit")
private EntityManager entityManager;
@Override
public void updateUser(User user){
entityManager.merge(user);
}
}
Run Code Online (Sandbox Code Playgroud)
我甚至不确定是否需要合并调用.Spring如何知道要使用哪个EntityManager,因为UserServiceImpl类中没有EntityManager声明?
我正在尝试为Spring Roo项目编写JUnit测试.如果我的测试需要使用实体类,我会得到以下异常:
java.lang.IllegalStateException: Entity manager has not been injected
(is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)
Run Code Online (Sandbox Code Playgroud)
Spring Aspects JAR看起来配置正确.特别是,我在pom.xml文件中有以下内容:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
和
<plugin>
<configuration>
<outxml>true</outxml>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
当没有从JUnit测试调用时,使用实体类的类工作正常.知道如何设置,以便从JUnit测试中注入实体管理器吗?
这是我的Test类(或多或少):
public class ServiceExampleTest {
@Test
public void testFoo() {
FooService fs = new FooServiceImpl();
Set<Foo> foos = fs.getFoos();
}
}
Run Code Online (Sandbox Code Playgroud)
这足以抛出异常.FooServiceImpl类返回一个Foo,其中Foo是一个实体类.该getFoos()应用程序时,通常的方式运行方法的工作.问题只出在单元测试的背景下.
我想知道是否可以通过实体管理器获取数据库连接属性.
我的persistence.xml看起来像这样
<persistence ...>
<persistence-unit name="default" transaction-type="JTA">
<jta-data-source>DatasourceForTestSystem</jta-data-source>
<class> some.package.and.some.Class </class>
...
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
我想要类似的东西
String host = em.getSomeFunction().getProperties().get("server");
String database = em.getSomeFunction().getProperties().get("database");
or
String url = em.getSomeFunction().getConnectionPool().getURL();
Run Code Online (Sandbox Code Playgroud)
url是什么样的jdbc:oracle:thin:@1.2.3.4:5678:database.我正在使用带有EclipseLink的JDeveloper 12c,一个Oracle数据库和NO Hibernate.
有人知道如何获取有关连接属性的信息吗?
亲切的问候,
STEFI
@Kostja:再次请求你的帮助,但正如我在帖子中提到的,我根本不使用Hibernate.
我已经尝试过像这样使用Connection.class了
java.sql.Connection conn = em.unwrap(java.sql.Connection.class);
Run Code Online (Sandbox Code Playgroud)
从这里开始.我总是在这个语句中为Connection和getSession()提供NPE
((JNDIConnector)em.unwrap(JpaEntityManager.class)
.getSession().getLogin().getConnector()).getName();
Run Code Online (Sandbox Code Playgroud)
从这里开始.
我很安静,为什么这些解决方案对我有用.也许我错过了什么:-(
我正在开始一个新项目,我对JPA/Hibernate的使用完全不熟悉.我正在尝试了解如何正确使用EntityManager.更准确地说,何时实例化它们,我需要多少,如果我关闭它们,我应该把所有东西都放到交易中吗?
无论如何,在我当前的代码中,我在尝试读取之前保存的实体时遇到了org.hibernate.LazyInitializationException.我会理解相反的事情(在事务中读取一个antity然后尝试在另一个事务中保存读取实体但是由于事务已经结束,实体是非托管的,因此保存失败),但这是我无法理解的.
我把我的代码放在GitHub上(https://github.com/GaetanLeu/intl),它只是几个类.我的主要是在src/sandbox/MessageSandbox.java中,它在第28行失败,带有以下stacktrace:
Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:164)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:285)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
at entity.MessageKey_$$_jvstfcc_0.toString(MessageKey_$$_jvstfcc_0.java)
at java.lang.String.valueOf(String.java:2854)
at java.lang.StringBuilder.append(StringBuilder.java:128)
at com.google.common.base.Present.toString(Present.java:88)
at java.lang.String.valueOf(String.java:2854)
at java.io.PrintStream.println(PrintStream.java:821)
at sandbox.MessageSandbox.main(MessageSandbox.java:28)
Run Code Online (Sandbox Code Playgroud)
另外我收到来自Hibernate的警告说我的EntityManager已经存在,那么会发生什么?EntityManagerFactory.createEntityManager方法是否返回现有的方法?
WARN: HHH000436: Entity manager factory name (intl) is already registered. If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name'
Run Code Online (Sandbox Code Playgroud)
真的,我迷失了什么时候创建EntityManagers ^^任何帮助将不胜感激,但请简单的解释我真的很新.
哦顺便说一下,我想确切地说我没有使用Spring,我没有EJB,我想现在手动操作EntityManagers直到我理解它为止.谢谢 :)
我目前正从EntityManager查询中获取连接超时错误.是否可以为这些设置超时?
persistence.xml中
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="CallPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>call.structure.Task</class>
<class>call.structure.Installation</class>
<class>call.structure.Contents</class>
<class>call.structure.Recipient</class>
<class>call.structure.CallTask</class>
<class>call.structure.SmsTask</class>
<class>call.structure.EmailTask</class>
<class>call.security.User</class>
<class>call.structure.content.Content</class>
<class>call.structure.content.RecordContent</class>
<class>call.structure.content.WaitContent</class>
<class>call.structure.content.TextContent</class>
<class>call.structure.content.VariableContent</class>
<class>call.structure.content.SoundContent</class>
<class>call.structure.content.SubjectContent</class>
<class>call.structure.content.FileContent</class>
<class>call.structure.Bounce</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@127.0.0.1:1521:TEST"/>
<property name="javax.persistence.jdbc.password" value="userpassword"/>
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
<property name="javax.persistence.jdbc.user" value="username"/>
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
代码在我的线程的run函数中超时:
private class TaskDB extends Thread {
private final long WAITING_TIME = 20000L;
@Override
public void run() {
Set<SmsTask> remove = SMSManager.this.getRemoveTask();
Set<SmsTask> normal = SMSManager.this.getNormalTask();
try {
while(true){
EntityManager em = …Run Code Online (Sandbox Code Playgroud) 我正在制作一个数据库迁移工具,并且正在处理一个非常笨拙的源数据库。它基本上是一张具有 40-50 列以上的巨型表格。然而,并非所有这些专栏对我都有用。我只想要大约十几个。获得该数据后,我将向 Web 服务发出请求,该服务将处理迁移目标端的所有内容。
我的选择基本上是手动创建查询以仅选择我想要的列,或者创建一个映射我想要的列的实体。我不太熟悉使用 JPA,所以我不确定这是否可能或可以。
我可以做类似的事情吗
@Entity
class SomeEntity{
@Column(name = "ColumnA")
private String columnA;
@Column(name = "ColumnB")
private String columnB;
}
Run Code Online (Sandbox Code Playgroud)
例如,如果数据库中的列是
Column A | Column B | Column C | Column D
Run Code Online (Sandbox Code Playgroud)
EclipseLink 会仅映射我注释的列,还是会抱怨尝试将数据库中的列映射到我的实体中不存在的字段?我知道 @Transient 会标记不应保留的字段。但我想做相反的事情,忽略数据库列,只将表部分映射到类。
entitymanager ×10
java ×6
jpa ×6
hibernate ×3
cdi ×1
doctrine ×1
eclipselink ×1
jakarta-ee ×1
java-ee-6 ×1
jta ×1
junit ×1
spring ×1
spring-mvc ×1
spring-roo ×1
timeout ×1
transactions ×1