我正在尝试为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()应用程序时,通常的方式运行方法的工作.问题只出在单元测试的背景下.
在标准EJB 3中,当注入实体管理器时,持久性单元(指数据源)被硬编码到注释中:(或者xml文件)
@PersistenceContext(unitName = "myunit")
private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)
有没有办法使用实体管理器,但在运行时按名称选择数据源?
我有一个名为Medico的实体,它是从数据库创建的实体类,因此我认为实体定义在这里是安全的,但定义如下:
@Entity
@Table(name = "medico")
@XmlRootElement
@NamedQueries({All named queries here})
public class Medico implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@NotNull
@Column(name = "idMedico")
private Integer idMedico;
@Basic(optional = false)
@NotNull
@Column(name = "Identificacion")
private int identificacion;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 33)
@Column(name = "Primer_Nombre")
private String primerNombre;
@Size(max = 33)
@Column(name = "Segundo_Nombre")
private String segundoNombre;
@Basic(optional = false)
@NotNull
@Size(min = …Run Code Online (Sandbox Code Playgroud) 我为我的项目使用JPA和Hibernate.我有两个具有相同名称但在不同包中的类.他们是:
@Entity(name = "X_USER")
@Table(name = "X_USER")
public class User {
Run Code Online (Sandbox Code Playgroud)
和:
@Entity
@Table(name="Y_USER")
public class User {
Run Code Online (Sandbox Code Playgroud)
我正在创建一个搜索查询:.getSimpleName()但它没有用,因为它们的简单名称是相同的.我改成了.getName().
但是,它仍然会让人感到困惑User.
编辑:
我有这个:
SELECT_BY_PROPERTY_QUERY = "SELECT p FROM :CLASS: p WHERE p.:PROPNAME:=?";
Run Code Online (Sandbox Code Playgroud)
那我:
SELECT_BY_PROPERTY_QUERY.replaceFirst(":CLASS:", clazz.getName()).replaceFirst(":PROPNAME:", propertyName);
Run Code Online (Sandbox Code Playgroud)
当我调试它时,它会像:
Select p from User p Where p.name=?
Run Code Online (Sandbox Code Playgroud)
它仍然是User,它不包括包信息,并返回错误的User类.
我需要执行此查询:
SELECT * FROM (SELECT * FROM product WHERE car = 'large' ORDER BY onSale DESC) AS product_ordered GROUP BY type
Run Code Online (Sandbox Code Playgroud)
在Symfony2中使用实体管理器.
我的基本查询构建器将是:
$query = $em->getRepository('AutomotiveBundle:Car')
->createQueryBuilder('p')
->where('pr.car = ?1')
->andWhere('pr.status = 1')
->orderBy('pr.onSale', 'DESC')
->setParameter(1, $product->getName())
->groupBy('p.type')
->getQuery();
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何在子查询中添加.
我试过单独的查询并加入它像:
->andWhere($query->expr()->in('pr.car = ?1',$query2->getQuery()));
Run Code Online (Sandbox Code Playgroud)
但我得到:
Call to undefined method Doctrine\ORM\Query::expr()
Run Code Online (Sandbox Code Playgroud) 我遇到了使用EntityManager将元素持久化到数据库的问题.根据我发现的答案,我在DaoJpa中尝试了这4种方法来做这样的事情,但仍然失败了.在这里,我附上了我尝试的四种方式:
控制器部分代码:
@Transactional
SmartProduct smartProduct = new SmartProduct();
smartProduct.setName("Dove Soap");
smartProductDao.persist(smartProduct);
Run Code Online (Sandbox Code Playgroud)
1.DaoJpa:
@Transactional
public void persist(SmartProduct smartProduct) {
entityManager.persist(smartProduct);
Run Code Online (Sandbox Code Playgroud)
不行!
2.
@Transactional
public void persist(SmartProduct smartProduct) {
entityManager.persist(smartProduct);
entityManager.flush();
Run Code Online (Sandbox Code Playgroud)
我得到的例外:没有交易正在进行中
3.
@Transactional
public void persist(SmartProduct smartProduct) {
EntityTransaction emTransaction = entityManager.getTransaction();
emTransaction.begin();
entityManager.persist(smartProduct);
emTransaction.commit();
entityManager.close();
Run Code Online (Sandbox Code Playgroud)
我得到的例外:不允许在共享的EntityManager上创建事务 - 使用Spring事务或EJB CMT
4.
@Transactional
public void persist(SmartProduct smartProduct) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit");
EntityManager em = emf.createEntityManager();
EntityTransaction etx = em.getTransaction();
etx.begin();
em.persist(smartProduct);
etx.commit();
em.close();
emf.close();
Run Code Online (Sandbox Code Playgroud)
我得到的例外:应用程序必须提供JDBC连接
有人可以帮我解决问题吗?提前谢谢了!
非常感谢JustinKSU的帮助.我在Spring上下文中添加了注释,然后它就解决了!这是我的Spring上下文的上一个版本:
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<property …Run Code Online (Sandbox Code Playgroud) 如何重置/重新启动实体管理器?
看看Doctrines文档:
我看到实体经理关闭的例外情况.这对我来说是一个问题,因为我有一个RabbitMQ服务器并且消费者总是在运行.Durring测试我们正在嘲笑不同的场景,缺少的数据就是其中之一.这应该导致和异常,我们的Try/Catch逻辑工作得很好,除了它还关闭了实体管理器.
读取他们所拥有或已经有相同或相关问题的其他线程,我没有看到重新启动EM的明确方法.
有什么想法吗?
有关:
我尝试运行此代码时收到此错误.
错误:
javax.persistence.TransactionRequiredException:通过容器管理的事务EntityManager的非事务性访问获得的Query对象不支持executeUpdate
代码:(_ut是UserTransaction对象)
public void setMainCategory(Integer deptId,Integer catId){
try {
Query setmain = _entityManager.createNamedQuery("Category.setAsMain");
Query removeMain = _entityManager.createNamedQuery("Category.removeMain");
setmain.setParameter("categoryId", catId);
Department d;
d=_entityManager.find(Department.class, deptId);
removeMain.setParameter("department", d);
_ut.begin();
removeMain.executeUpdate();
_ut.commit();
_ut.begin();
setmain.executeUpdate();
_ut.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
我有其他功能在实现上相同,他们不会抛出此错误.
任何建议将不胜感激.
谢谢.
我想知道是否可以通过实体管理器获取数据库连接属性.
我的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 ×10
java ×5
jpa ×5
hibernate ×3
symfony ×2
doctrine ×1
doctrine-orm ×1
ejb-3.0 ×1
exception ×1
jpa-2.0 ×1
jpql ×1
jta ×1
junit ×1
persistence ×1
php ×1
spring ×1
spring-roo ×1
sql-update ×1
transactions ×1