标签: entitymanager

在Spring中,如何使用ClassPathXmlApplicationContext获取EntityManager?

使用Spring,我可以使用以下属性自动装配bean:

@PersistenceContext(unitName="foo") private EntityManager em;
Run Code Online (Sandbox Code Playgroud)

使用以下我可以手动自动装配bean"someBean":

ClassPathXmlApplicationContext ctx = 
      new ClassPathXmlApplicationContext("META-INF/applicationContext.xml");
AutowireCapableBeanFactory fac = ctx.getAutowireCapableBeanFactory();
fac.autowireBean(someBean);
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何直接获取特定的EntityManager.用例是我想编写一个测试,它将获取所有EntityManager对象并在其中执行简单查询,以确保它们已正确设置.为此,我需要能够从应用程序上下文中获取所有EntityManager对象.我怎样才能做到这一点?

以下不起作用.它返回一张空地图.

Map<String,EntityManager> ems = ctx.getBeansOfType(EntityManager.class);
Run Code Online (Sandbox Code Playgroud)

spring entitymanager

4
推荐指数
1
解决办法
2万
查看次数

EntityManager何时提交?

我有以下服务......

@Stateless
@LocalBean
public class RandomService {

    @EJB RandomString stringTokenizer;

    @PersistenceContext
    EntityManager em;

    public String generate(Actions action)
    {
        Token token = new Token();
        token.setAction(action);
        token.setExpiry(new Date());
        token.setToken(stringTokenizer.randomize());

        em.persist(token);
        //em.flush();

        return String.format("%010d", token.getId()) + token.getToken();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我没有放入em.flush()那么行token.getId()将返回null(使用DB GENERATED SEQUENCE)虽然我知道如果我将Token而不是字符串返回给调用服务,则设置id.因此,当服务返回令牌对象时,EM似乎会刷新,但是当我放置String时,EM则不会刷新.通过把冲洗我得到我需要的是正确的吗?

jpa jersey entitymanager ejb-3.1

4
推荐指数
1
解决办法
1万
查看次数

带有CDI托管Bean和有状态会话Bean的LazyInitializationException

我有一个CDI Managed Bean(一个用@Named注释的bean,用于JSF),它注入了一个Stateful Session Bean.这个会话bean就像一个服务,它有实体管理器(用@PersistenceContext(type = PersistenceContextType.EXTENDED)注释)并公开来操作某些实体的方法.这些实体位于托管bean上,即ConversationScoped.然后,JSF调用托管bean的方法,托管bean调用"service"(有状态会话bean)的某个方法.我不知道这是不是最好的设计,但它运作良好.但是有一个实体有一些需要用LAZY获取的集合.第一次打开页面时,它似乎运行良好,但是当我尝试单击任何按钮或执行任何操作时,我都有LazyInitializationException.有人有任何提示吗?我不知道有什么不对劲.我把会话bean放在有状态,扩展持久化上下文.此会话bean在具有实体的托管bean中注入.为什么它会抛出这个例外?如何关闭实体经理?

这是陷入困境的实体的代码:

@Entity
public class ParametrosVingentes implements Serializable {

    public static final String ID = "settings";

    private static final long serialVersionUID = 1L;

    @Id
    private String id;
    @OneToOne
    private ValorHora valorHora;
    @OneToMany
    @JoinTable(
            name="BuscaSistecVingentes",
            joinColumns = @JoinColumn( name="parametros_vingentes_fk"),
            inverseJoinColumns = @JoinColumn( name="agendamento_fk")
    )
    private List<AgendamentoBuscaSistec> agendamentosBuscaSistec;
    @OneToMany
    @JoinTable(
            name="ExportacaoZeusVingentes",
            joinColumns = @JoinColumn( name="parametros_vingentes_fk"),
            inverseJoinColumns = @JoinColumn( name="agendamento_fk")
    )
    private List<AgendamentoExportacaoZeus> agendamentosExportacaoZeus;
    @OneToMany
    @JoinTable(
            name="ImportacaoZeusVingentes",
            joinColumns = @JoinColumn( name="parametros_vingentes_fk"),
            inverseJoinColumns = @JoinColumn( name="agendamento_fk")
    )
    private …
Run Code Online (Sandbox Code Playgroud)

entitymanager stateful-session-bean lazy-initialization jsf-2 ejb-3.1

4
推荐指数
1
解决办法
3332
查看次数

如何在Symfony2中拥有模型管理器?

对不起,如果这个问题已经得到解答,我找不到任何问题.

我在Symfony2中构建这个模型:

class LogEntry {
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var \DateTime $log_timestamp
     *
     * @ORM\Column(name="log_timestamp", type="datetime")
     */
    private $log_timestamp;

    /**
     * @var TranslationMapping $source
     *
     * @ORM\ManyToOne(targetEntity="TranslationMapping", cascade={"persist"})
     * @ORM\JoinColumn(name="source", referencedColumnName="id")
     */
    private $source;

    /**
     * @var TranslationMapping $target
     *
     * @ORM\ManyToOne(targetEntity="TranslationMapping", cascade={"persist"})
     * @ORM\JoinColumn(name="target", referencedColumnName="id")
     */
    private $target;
...
}
Run Code Online (Sandbox Code Playgroud)

使用TranslationMapping像这样:

/**
 * LogAnalyzer\Bundle\CombatLogBundle\Entity\TranslationMapping
 *
 * @ORM\Table(name="TranslationMapping", uniqueConstraints={@ORM\UniqueConstraint(name="idValue_idx", columns={"stringId", "stringValue"})})
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks()
 */ …
Run Code Online (Sandbox Code Playgroud)

design-patterns entitymanager symfony doctrine-orm

4
推荐指数
1
解决办法
5781
查看次数

会话bean中的EntityManager异常处理

我有一个带有注入的EntityManager em的托管无状态会话bean.

我想要做的是拥有一个具有唯一列的数据库表.然后我运行一些试图插入实体的算法.如果实体存在,则会更新或跳过它.

我想要这样的东西:

try {   
em.persist(cd);     
em.flush();     
} catch (PersistenceException e) {  
// Check if the exception is DatabaseException and ConstraintViolation
    // Update instead or skip it
}
Run Code Online (Sandbox Code Playgroud)

问题是我只能抓到PersistenceException.DatabaseException没有被抓住.这是可悲的,因为只有DatabaseException已调用的方法getDatabaseErrorCode(),我想用它来检查重复的条目.我不理解它因为PersistenceException.getCause()回归DatabaseException.

所以我的问题是:如何捕获DatabaseException并检查MySQL错误代码?

感谢您对此的任何想法和经验.

java mysql jpa entitymanager

4
推荐指数
1
解决办法
8593
查看次数

symfony doctrine连接刷新持续存在

"问题"

在分析器中:

  • 选择查询
  • 另一个选择查询
  • 第三个查询

现在我调用插入控制器,因此这个查询已经执行

    $re=new Requests();
    $re->setViewed(false);
    $em->persist($add);
    $em->flush();
Run Code Online (Sandbox Code Playgroud)

它导致另一个"3"查询: 在此输入图像描述

好吗?或者我做错了什么?...

flush entitymanager symfony doctrine-orm

4
推荐指数
1
解决办法
6114
查看次数

java.lang.IllegalArgumentException:找不到命名查询:

我得到了以下代码

@Stateless
public class BondecomandeDAO {

    @PersistenceContext
    private EntityManager em;

    public Bondecommande findBCbyid(int id)
    {
         Query q =em.createNamedQuery("select bc from Bondecommande bc where bc.idbc = :idbc");
         q.setParameter("idbc", id);
         return  (Bondecommande) q.getResultList().get(0);
     }
}
Run Code Online (Sandbox Code Playgroud)

@Entity
@Table(name="bondecommande")
public class Bondecommande  implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="idbc")
    private int idbc;
    @Column(name="devise")
    private String devise;
    @Column(name="modepaiement")
    private String modepaiement;
    @Column(name="modelivraison")
    private String modelivraison;
    @Column(name="delaipaiement")
    private int delaipaiement;

      ////other attributes , getters and setters 
} …
Run Code Online (Sandbox Code Playgroud)

java jpa entitymanager ejb-3.0

4
推荐指数
2
解决办法
3万
查看次数

Spring - Hibernate使用FlushMode提高事务性能

我正在努力提高我的asynk事务方法的性能.

在这个任务中,我必须从表中读取近7500条记录,详细说明,并在另一个表中插入/更新相应的行.

我正在使用spring数据jpa和hibernate.

为了得到一个ScrollableResults我注入EntityManager我的服务.

我在这里得到我的ScrollableResult对象:

Session session = (Session) em.unwrap(Session.class);
        ScrollableResults res = session.createQuery("from SourceTable s")
                .setCacheMode(CacheMode.IGNORE)
                .scroll(ScrollMode.FORWARD_ONLY);


while (res.next()){
.... // em.flush() called every 40 cycles
}
Run Code Online (Sandbox Code Playgroud)

循环结果大约需要60秒.

而这里的瓶颈.如果在我的循环中我执行一个简单的查询:

query = em.createQuery("from DestTable d where d.item.id = :id", DestTable.class);

 while (res.next()){
     query.setParameter("id", myId).getSingleResult();     
 }
Run Code Online (Sandbox Code Playgroud)

执行时间变得慢了x10 ..并且需要大约600秒.

我试图修改我Session或我的参数EntityManager:session.setFlushMode(FlushModeType.COMMIT); em.setFlushMode(FlushModeType.COMMIT);

它提高了性能并删除了手动flush()方法,工作在40年代完成!

所以我的问题是:

  • 是什么叫的差异setFlushModesession还是enityManager
  • 为什么要setFlushMode(FlushModeType.COMMIT);以这种方式增加性能,而且我只能通过手动刷新entityManager来获得相同的性能?

java spring hibernate entitymanager spring-data-jpa

4
推荐指数
1
解决办法
6399
查看次数

如何使用在控制器中返回虚假存储库的mock entitymanager?

在我的测试中,我正在尝试模拟实体管理器,因此它将返回一个不会连接到数据库但是返回假值的存储库:

在根据此文档的测试中:

  $session = new Session(new MockArraySessionStorage());
  $mockManager = $this
        ->getMockBuilder('\Doctrine\Common\Persistence\ObjectManager')
        ->disableOriginalConstructor()
        ->getMock();
  $mockManager->expects($this->any())
        ->method('getRepository')
        ->will($this->returnValue(new userRepo()));      
  $client = static::createClient();
  $container = $client->getContainer();
  $container->set('session', $session);
  $container->set('doctrine.orm.entity_manager',$mockManager);
  $client->request('POST', '/secured/login'
      ,array('userName'=>'username','password'=>'password'
      ,'rememberMe'=>'on'));
  $response = $client->getResponse();
  //....
Run Code Online (Sandbox Code Playgroud)

在测试中,userRepo:

class userRepo {
  public function isValidUser($userName, $password) {
    echo "this is isvaliduser";
    return $this->getFullUserById(22);
  }
  public function getFullUserById($id){
    echo "this is getfulluserbyid";
    return ["name"=>"someName"];
  }
}
Run Code Online (Sandbox Code Playgroud)

在控制器中:

  public function loginAction(Request $request) {
    $userRepo = $this->getDoctrine()->getManager()
        ->getRepository('mytestBundle:User');
    $user=$userRepo->isValidUser($userName,$password);
    $response = new Response();
    //... other …
Run Code Online (Sandbox Code Playgroud)

phpunit doctrine mocking entitymanager symfony

4
推荐指数
1
解决办法
2336
查看次数

更新/删除查询不能键入JPA

我正在使用Spring框架来开展培训项目.我也在使用JPA,并且一直有一段时间.在我的DAO实现课中,我写道:

@Override
public void deleteEntries(Module mod) {
    System.out.println(mod.getDescription());
    entityManager.createQuery("delete from TrainingEntry e where e.module = :mod and e.completedDate IS NULL",
                              TrainingEntry.class).setParameter("mod", mod);

}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它只是一个简单的DELETE语句,但我收到错误:

"Update/delete queries cannot be typed."
Run Code Online (Sandbox Code Playgroud)

我的猜测是,我需要使用一些EntityManager类方法来完成这项工作,但我不确定,因为在线这个错误几乎没有.我也很难应用我在网上找到的有关JPA删除查询的一些解决方案.任何关于正确方向的点或解释为什么抛出这个错误都非常感激.

java spring jpa entitymanager sql-delete

4
推荐指数
2
解决办法
1万
查看次数