我正在使用Spring + JPA + Hibernate + EntityManager与数据库进行通信.我得到'A JTA EntityManager无法使用getTransaction() '错误.请提供您的见解并帮助我解决问题.
beans.xml中
<?xml version="1.0" encoding="UTF-8"?>
<beans default-autowire="byName"
... xmlns definitions...
xsi:schemaLocation="...">
<context:component-scan base-package="com.mycompany.myproject" />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="myDAO" class="com.mycompany.myproject.dao.myDAO" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven />
</beans>
Run Code Online (Sandbox Code Playgroud)
persistence.xml中
<?xml version="1.0" encoding="UTF-8"?>
<persistence ... xmlns definitions xsi:schemaLocation="..." version="1.0">
<persistence-unit name="TEST_DS">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/TEST_DS</jta-data-source>
<class>com.twinspires.exchange.model.Test</class>
<properties>
<property name="hibernate.archive.autodetection" value="class, hbm" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="validate" /> <!-- create-drop update -->
<property …
Run Code Online (Sandbox Code Playgroud) 我想用Java实现一个能够与数据库交互的程序.我已经使用EJB做了类似的事情,但这次我需要它能够在没有应用程序服务器的情况下工作.到目前为止我所做的是(使用Eclipse):
persistence.xml
(在META-INF
文件夹中)MySQL JDBC Driver
库和persistence-api-1.0.2.jar
这是我的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="top" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>database.Match</class>
<class>database.Player</class>
<class>database.Tournament</class>
<properties>
<property name="hibernate.connection.provider_class" value="org.hibernate.connection.DriverManagerConnectionProvider"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/top"/>
<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
以下是我尝试使用的方法EntityManager
:
private static EntityManagerFactory factory;
private EntityManager entityManager;
public DBManager() {
factory = Persistence.createEntityManagerFactory("top");
entityManager = …
Run Code Online (Sandbox Code Playgroud) 我有一个类,其中包含通过实体管理器创建客户对象的方法。我想添加另一个方法,该方法将返回一组创建的对象;对于我的情况我该怎么做?例如,我有以下代码:
public class DefaultCoreRepository implements CoreRepository {
private EntityManager entityManager;
@PersistenceContext(unitName = "crm-db")
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
private <T> T persist(T entity) {
entityManager.persist(entity);
return entity;
}
public void createCustomer(Customer customer) {
persist(customer);
}
public Set<Customer> getCustomers() {
//Code to be written here
}
Run Code Online (Sandbox Code Playgroud) 我尝试从作曲家安装doctrine2 orm,它是成功的,我设置了我的bootstrap.php,如下图所示
<?php
define('DS', DIRECTORY_SEPARATOR);
define('ROOT', dirname(dirname(__FILE__)));
// bootstrap.php
require_once "vendor/autoload.php";
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
$paths = array(ROOT.DS.'library'.DS.'doctrine/entities/');
$isDevMode = false;
// the connection configuration
$dbParams = array(
'driver' => 'pdo_mysql',
'user' => 'root',
'password' => '',
'dbname' => 'meso',
);
$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);
$entityManager = EntityManager::create($dbParams, $config);
?>
Run Code Online (Sandbox Code Playgroud)
这是我的cli-config.php
<?php
use Doctrine\ORM\Tools\Console\ConsoleRunner;
// replace with file to your own project bootstrap
require_once 'bootstrap.php';
// replace with mechanism to retrieve EntityManager in your app
$entityManager = GetEntityManager();
return ConsoleRunner::createHelperSet($entityManager); …
Run Code Online (Sandbox Code Playgroud) 当使用普通 Hibernate 时,可以通过以下方式完成:
public class MyLocalSessionFactoryBean extends LocalSessionFactoryBean {
// can also be made configurable e.g. with Springs EL...
private Class myIdentifierGeneratorClass = MyIdentifierGeneratorClass.class;
@Override
protected SessionFactory buildSessionFactory(LocalSessionFactoryBuilder sfb) {
Configuration config = getConfiguration();
MutableIdentifierGeneratorFactory identifierGeneratorFactory = config.getIdentifierGeneratorFactory();
identifierGeneratorFactory.register("xyz", myIdentifierGeneratorClass);
return super.buildSessionFactory(sfb);
}
}
Run Code Online (Sandbox Code Playgroud)
现在可以写例如
@MappedSuperclass
public class BaseEntity implements Serializable {
@Id
@GeneratedValue(generator = "generatorName")
@GenericGenerator(name = "generatorName", strategy = "xyz")
private Long id;
}
Run Code Online (Sandbox Code Playgroud)
使用 Hibernate JPA EntityManager 时如何实现这一点?
也许通过利用LocalContainerEntityManagerFactoryBean#postProcessEntityManagerFactory(EntityManagerFactory emf, PersistenceUnitInfo pui)
?
我也发现了EntityManagerFactoryBuilderImpl#buildHibernateConfiguration(ServiceRegistry serviceRegistry) …
我需要根据传递的参数动态生成查询并需要加入三个表,在使用 EntityManager CriteriaBuilder 构建查询时遇到异常,如果我将其转换为 Criteria,则相同的代码结构正在工作,但我只想使用 CriteriaBuilder。
@Override
@Transactional
public List<DatapointReply> getAllByFilter(Map<String, List<Object>> filter, int maxResults,
boolean matchAllFilters) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<DatapointReply> criteriaQuery = criteriaBuilder.createQuery(DatapointReply.class);
Root<PartDatapointReply> datapointReplyRoot = criteriaQuery.from(PartDatapointReply.class);
Join<DatapointReply, Datapoint> datapointJoin = null;
Join<PartDatapointReply, Part> partJoin = null;
criteriaQuery.select(datapointReplyRoot);
if (filter.containsKey("datapointkey")) {
datapointJoin = datapointReplyRoot.join("datapoint");
}
if (filter.containsKey("partstatus") || filter.containsKey("partmodelnumber")) {
partJoin = datapointReplyRoot.join("part");
}
List<Predicate> predicateList = new ArrayList<>();
for (String searchKey : filter.keySet()) {
List<Object> searchTerms = filter.get(searchKey);
Predicate predicate = buildSearchCriterion(new String[searchTerms.size()], true, JunctionType.OR, datapointReplyRoot, …
Run Code Online (Sandbox Code Playgroud) 我对 MikroOrm 或任何类似实体管理器中的功能有点困惑em.clear()
。
https://mikro-orm.io/docs/entity-manager方法的链接clear()
。
我似乎有一些关于一般 EntityManager 的 stackoverflow 答案说我需要clear()
在每次调用后调用persist/remove and flush
以避免任何内存问题。
为了使这个问题更具体地适合我的情况,据说我在我的应用程序中建立了一个Graphql
端点。有一些通用的 CRUD 函数供用户调用,每个函数都会MikroOrm entity
利用一些 MikroOrm 函数(例如findOne()
等)创建一个对数据库进行一些通用 CRUD 操作的函数。
这是否意味着我需要clear()
每次调用persist/remove and flush
(如果有一些 CUD 操作)甚至仅读取数据?如果我不调用这个方法会发生什么?
以下代码在调用"em.refresh(p)"时抛出异常:
1: EntityManager em = emf.createEntityManager();
2: em.getTransaction().begin();
3:
4: Product p = new Product("J&D", 35.0,"Whisky");
5: em.persist(p);
6:
7: em.refresh(p);
8: em.getTransaction().commit();
9: em.close();
Run Code Online (Sandbox Code Playgroud)
在调试代码时,我们看到Hibernate没有在第6行将记录写入数据库.他的确如预见 - 当需要时,而不是更早.
在第7行,我们得到以下异常:线程"main"中的异常javax.persistence.PersistenceException:org.hibernate.HibernateException:此实例尚未作为数据库中的行存在
当我们强制Hibernate在第6行将记录刷新到DB时,执行INSERT并且不会发生错误.我们可以通过执行select或只强制刷新来执行此操作(具有所有后果):
6 : em.createQuery("select p from Product p").getResultList();
6 : em.flush();
Run Code Online (Sandbox Code Playgroud)
我的问题:如果方法"刷新"不强制Hibernate将记录写入数据库,那么我们之前放置的select或flush语句也是如此?(这可能是个错误吗?).
提前感谢您的回答.
皮埃尔
我的问题是,当我尝试使用$em->find
方法查找数据库记录时,它返回一个Controller.
让我举一个例子:
Neostat\DiagnosticoBundle\Controller\ComponentController.php
:
$em = $this->getDoctrine()->getEntityManager();
$diagnostico = $em->getRepository('NeostatDiagnosticoBundle:Diagnostico')->find($id);
var_dump(get_class($diagnostico));
Run Code Online (Sandbox Code Playgroud)
它回来了Neostat\DiagnosticoBundle\Controller\ComponentController
.
但我有一个名为实体Diagnostico.php
在src/Neostat/DiagnosticoBundle/Entity/Diagnostico.php
:
namespace Neostat\DiagnosticoBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Neostat\PacienteBundle\Entity\Paciente;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* Diagnostico
*
* @ORM\Table(name="diagnostico")
* @ORM\Entity(repositoryClass="Neostat\DiagnosticoBundle\Entity\DiagnosticoRepository")
* @UniqueEntity(fields={"nombre"}, message="Ya existe un diagnostico con ese nombre.")
*/
class Diagnostico
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
// etc...
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
正如你在下面看到的,我根本没有"坚持".但我所做的改变是注册.我很感激你的帮助.
$entityManager = $this->getDoctrine()->getManager();
$entity = $entityManager->getRepository(City::class)->find(1);
$entity->setName("debug name");
$entityManager->flush();
entitymanager ×10
jpa ×6
hibernate ×4
doctrine ×3
jpa-2.0 ×2
orm ×2
spring ×2
symfony ×2
java ×1
mapping ×1
mikro-orm ×1
persistence ×1
php ×1
spring-data ×1