我正在致力于标准化遗留代码库和新开发,以使用 EntityManager 进行持久化。然而,为了取得成功,我需要提供突破本机 SQL 并手动处理结果的能力。JPA EntityManager 几乎通过以下方式提供此功能:
em.createNativeQuery("select ... from my_table where ...");
Run Code Online (Sandbox Code Playgroud)
但我缺少的是执行 Spring 风格的 RowMappers 的能力。我可以看到有一些接近的机制。我当然可以使用注释、xml 等来映射实体,但我需要将代码放入结果集中每一行的处理中,因此这不是一个选项。我可以看到我可以传入 SQLResultSetMapping,但据我所知,这再次仅支持元数据映射。理想情况下,我需要的是以下内容:
em.createNativeQuery("select ... from my_table where ...",
new RowMapper {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
MyObject o = new MyObject();
o.setMyCustomProperty( rs.get...() );
//...
return b;
}
}
);
Run Code Online (Sandbox Code Playgroud)
与上述等价的存在吗?我可以构造一个 SQLResultSetMapping 来完全控制上面的映射吗?
如果没有,我至少可以以标准方式获取 EM 底层的数据源,以便我可以使用 JdbcTemplate 包装它,并且没有两个路径来配置数据源吗?
DataSource ds = em.getDataSource();
JdbcTemplate t = new JdbcTemplate(ds);
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助。
为了同步和检索数据库生成的 ID,我觉得被迫EntityManager.flush()
在几个地方调用。
除了性能影响之外,还有什么理由不打电话flush()
呢?
换句话说,我的 (DAO, ...) 方法的调用者是否有任何可观察到的差异(如果有/没有)flush()
?
我的场景是在支持 JPA 开发人员的框架上下文中。我将提供一些功能,这些功能可能需要也可能不需要flush()
调用层次结构深处的某个地方。这些函数的用户是否必须知道是否/何时发生刷新,或者它是一个私有实现细节,对调用者没有明显影响?
我一直认为@PersistenceContext用于将EntityManager注入到容器管理的应用程序中,而@PersistenceUnit用于注入EntityManagerFactory。
Javadoc 说
对于 PersistenceUnit ( http://docs.oracle.com/javaee/7/api/javax/persistence/PersistenceUnit.html )
表达对 EntityManagerFactory 及其关联的持久性单元的依赖关系。
对于PersistenceContext(http://docs.oracle.com/javaee/7/api/javax/persistence/PersistenceContext.html)
表达对容器管理的 EntityManager 及其关联的持久性上下文的依赖关系。
到目前为止一切顺利,但后来我正在阅读 JPA 教程(请参阅https://docs.oracle.com/cd/E19798-01/821-1841/bnbqy/index.html),其中包含这样的示例
以下示例显示如何在使用应用程序管理的实体管理器的应用程序中管理事务:
@PersistenceContext
EntityManagerFactory emf;
EntityManager em;
@Resource
UserTransaction utx;
...
em = emf.createEntityManager();
try {
utx.begin();
em.persist(SomeEntity);
em.merge(AnotherEntity);
em.remove(ThirdEntity);
utx.commit();
} catch (Exception e) {
utx.rollback();
}
Run Code Online (Sandbox Code Playgroud)
那么如果我们谈论应用程序托管代码,PersistenceContext 也可以引用 EntityManagerFactory 吗?
免责声明——我猜与这个问题的答案无关——PersistenceUnit vs PersistenceContext
当我在保存 ClaimDetail 对象后获取 id 然后获取该保存对象的 id 时,我遇到了问题,它是 0 。实际上我想获取保存的对象 Id 。但它没有来。我没有在 JPA 工作过。我创建了一个用于调度的 Spring Boot 应用程序。
这是我的 ClaimDetails.java 实体类:
@Entity
@Table(name = "claimtrans")
public class ClaimTrans {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
claimDetail.setActive(1);
claimDetail.setVersion(new Long(1));
claimDetail.setCreatedBy(new Long(1));
claimDetail.setCreatedDate(new Date());
claimDetailService.saveClaimDetail(claimDetail);
int temp =claimDetail.getID()
Run Code Online (Sandbox Code Playgroud)
温度为0;
这是我的 JpaRepositoryFactory.java:
@Service
public class ClaimDetailService {
private JpaRepositoryFactory jpaRepositoryFactory;
@Autowired
public ClaimDetailService(JpaRepositoryFactory jpaRepositoryFactory) {
this.jpaRepositoryFactory = jpaRepositoryFactory;
}
@Transactional
public void saveClaimDetail(ClaimDetail claimDetail) {
JpaRepository<ClaimDetail, Long> mailAuditLogLongJpaRepository = jpaRepositoryFactory.getRepository(ClaimDetail.class);
mailAuditLogLongJpaRepository.save(claimDetail);
}
public …
Run Code Online (Sandbox Code Playgroud) 使用 Wildfly 10 进行以下操作:JSON Web 服务通过 DAO 对象使用 hibernate 访问 postgresql 数据库。
更具体地说,我的 POJO User.java:
@Entity (name="User")
@Table(name = "users")
public class User {
@Id @GeneratedValue
@Column(name="id")
private int id;
@Column(name="username")
private String userName;
@Column(name="password")
private String password;
@Column(name="email")
private String emailAddress;
public User(String userName, String password, String emailAddress) {
super();
this.userName = userName;
this.password = password;
this.emailAddress = emailAddress;
}
public User() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = …
Run Code Online (Sandbox Code Playgroud) 我想在使用 2 个不同实体管理器的服务中使用自动装配。如何实现这样的目标?
use Doctrine\ORM\EntityManager;
class TestService
{
public function __construct(EntityManager $emA, EntityManager $emB)
{
}
}
Run Code Online (Sandbox Code Playgroud)
我的 service.yml 文件的配置如下:
app.testservice:
class: App\Services\TestService
arguments:
- "@doctrine.orm.default_entity_manager"
- "@doctrine.orm.secondary_entity_manager"
Run Code Online (Sandbox Code Playgroud) 教义建议——
自 Doctrine/persistence 1.3 起,不推荐使用任何参数调用 Doctrine\ORM\EntityManager::clear() 来清除特定实体,并将在 2.0 中删除。
我们的 Symfony 代码库中有很多参考资料->clear(SpecificEntity::class)
,并且正在寻求更新这些内容,但我们正在努力在最新的升级指南中找到建议的替代方案。
在最新版本的 Doctrine 中是否有推荐的替代方案来清除特定实体?
我正处于从JBoss AS 6到JBoss AS 7的迁移过程中,并且我的测试有问题.我们假设一个简单的实体EJB:
@Entity public class MyTest implements Serializable
{
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private long id;
@NotNull
private String headline;
} //getter/setter
Run Code Online (Sandbox Code Playgroud)
在我@Stateless Bean
做这样的事情(就像之前的JBoss5和JBoss6):
@Inject private EntityManager em;
public <T extends Object> T persist(T o) throws MyContraintViolationException
{
System.out.println("***************** persist:");
try
{
em.persist(o);
}
catch (Exception e)
{
System.out.println("*************** exception:");
// Further investigation of Exception e,
// then throw MyContraintViolationException
}
}
Run Code Online (Sandbox Code Playgroud)
如果我不违反@NotNull
约束,这可以正常工作.如果headline==null
,我得到例外,但不要输入我的catch
块:
12:19:45 INFO ******************** persist:
12:19:45 WARN …
Run Code Online (Sandbox Code Playgroud) 我在Entity类中有这个函数,但是getDoctrine并不喜欢......
public function getObject()
{
$em = $this->getDoctrine()->getEntityManager();
switch($this->objectType)
{
case 'video':
return $em->getRepository('fdj2012AdminBundle:Video')->find($this->objectId);
break;
case 'default':
return false;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
如何在我的实体中使用entityManager?
在Symfony2中,是否可以检查特定实体是否已经持久存在并存在于EntityManager中?
我正在处理一些数据导入,一些记录可能是完全重复的.我正在进行批量插入,即只在持久存在一定数量的实体后才调用flush().所以,我需要检查我试图保持的实体是否已经不在EntityManager中.
entitymanager ×10
java ×4
jpa ×4
symfony ×4
doctrine ×2
hibernate ×2
spring ×2
autowired ×1
doctrine-orm ×1
eclipselink ×1
ejb ×1
entity ×1
flush ×1
jboss7.x ×1
jpa-2.0 ×1
mysql ×1
persistence ×1
postgresql ×1
spring-boot ×1
wildfly ×1