使用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) 我有以下服务......
@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则不会刷新.通过把冲洗我得到我需要的是正确的吗?
我有一个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
对不起,如果这个问题已经得到解答,我找不到任何问题.
我在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) 我有一个带有注入的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错误代码?
感谢您对此的任何想法和经验.
"问题"
在分析器中:
现在我调用插入控制器,因此这个查询已经执行
$re=new Requests();
$re->setViewed(false);
$em->persist($add);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
它导致另一个"3"查询:

好吗?或者我做错了什么?...
我得到了以下代码
@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) 我正在努力提高我的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年代完成!
所以我的问题是:
setFlushMode上session还是enityManager?setFlushMode(FlushModeType.COMMIT);以这种方式增加性能,而且我只能通过手动刷新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) 我正在使用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删除查询的一些解决方案.任何关于正确方向的点或解释为什么抛出这个错误都非常感激.