我在Jboss AS 6.0.0 final上使用Hibernate 3.6.0和JPA 2.在我的EJB中,有一种方法可以更新实体值并对其进行一些查询.整个方法在BMT事务中运行.如果有任何失败,所有更改都应该回滚,而不是提交给DB.
数据库是mySql.
在运行JPA查询之前,JPA会自动将更改的状态刷新到DB,以防止任何过时的数据返回.但是,在我的方法中,自动刷新直接更新并将更改提交到DB,甚至之后出现了错误,更改不会回滚.所以我想问一下我的设置中是否有错误的配置,或者这是一个错误或什么的.
EJB
@Stateless(mappedName = "MyManagementBean")
@Local
@TransactionManagement(TransactionManagementType.BEAN)
public class MyManagement implements MyManagementLocal,MyManagementRemote {
@PersistenceUnit(unitName="MyEjb") EntityManagerFactory emf;
@Resource UserTransaction utx;
@Resource SessionContext ctx;
/**
* Default constructor.
*/
public MyManagement () {
// TODO Auto-generated constructor stub
}
public void dosomething(String id) throws Exception
{
try {
utx.begin();
em = emf.createEntityManager();
Myline line = em.find(Myline.class, id);
line.setStatus("R");
Stromg q += " from Myline as line ";
//auto flush apply here and directly committed to …Run Code Online (Sandbox Code Playgroud) hibernate transactions entitymanager hibernate-entitymanager jpa-2.0
我有以下代码:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("test")
EntityManager entityManager = emf.createEntityManager()
User user = entityManager.find(User.class, 0);
entityManager.getTransaction().begin();
entityManager.getTransaction().rollback();
entityManager.refresh(user);
Run Code Online (Sandbox Code Playgroud)
这会在第四行抛出IllegalArgumentException,说"实体未被管理".如果我改变第三行.commit()而不是.rollback(),一切似乎都正常.
这里发生了什么?我可以防止这种情况发生吗?
更新: @DataNucleus将我引向PersistenceContext.如何更改代码中的持久性上下文?
我正在将Hibernate和JPA用于一个小项目.
不知何故,当试图获得一个类型化的查询时,
java.lang.AbstractMethodError: org.hibernate.ejb.EntityManagerImpl.createQuery(Ljava/lang/String;Ljava/lang/Class;)Ljavax/persistence/TypedQuery
Run Code Online (Sandbox Code Playgroud)
被抛出; org.hibernate.ejb.EntityManagerImpl来自hibernate-entitymanager-3.3.2.GA.jar.
抛出上述异常是不行的:
public Account read(Account entity) {
EntityManager em = ManagedEntityManagerFactory.getEntityManager();
String jpql = JPQLGenerator.readAccount();
TypedQuery<Account> typedQuery =
em.createQuery(jpql, Account.class);
typedQuery.setParameter("accountId", entity.getAccountId());
return typedQuery.getSingleResult();
}
Run Code Online (Sandbox Code Playgroud)
但是这没关系:
public Account read(Account entity) {
EntityManager em = ManagedEntityManagerFactory.getEntityManager();
String jpql = JPQLGenerator.readAccount();
Query query =
em.createQuery(jpql);
query.setParameter("accountId", entity.getAccountId());
Account account = null;
Object obj = query.getSingleResult();
if(obj instanceof Account) {
account = (Account)obj;
}
return account;
}
Run Code Online (Sandbox Code Playgroud) 我有一个实体(Contact),它有一个延迟加载的集合.我没有改变这个但是我需要在我执行em.find(Contact.class,myID)时加载集合,这可以在不更改实体且不使用带有fetch的jpql语句的情况下完成.?
public class Contact implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@Column(name="contactId", nullable=false)
public String contactId;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "contact", orphanRemoval = true, fetch=FetchType.LAZY)
private List<ContactTaskRelation> taskRelations = new ArrayList<ContactTaskRelation>();
}
Run Code Online (Sandbox Code Playgroud)
从我的无数据豆
@PersistenceContext(unitName="myContext")
private EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private Contact getContact(ContactMapping mappedContact){
//force em to load the collection of taskRelations
return em.find(Contact .class, mappedContact.getContact());
}
Run Code Online (Sandbox Code Playgroud) 我不明白如果在表中找不到id,find()方法是否返回null.在文档中没有说什么.让我们考虑这个代码,其中用户名是表中的主键
public boolean isUserInDb(String username)
{
boolean isPresent = false;
if(em.find(UserCredential.class, username) != null)
{
isPresent = true;
}
return isPresent;
}
Run Code Online (Sandbox Code Playgroud)
它可以工作吗?
我正在尝试获取特定组中的用户数量,我已完成以下操作:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> q = cb.createQuery(Long.class);
q.select(cb.count(q.from(User.class))).where(cb.equal(q.from(User.class).get("userGroup"), groupId));
Run Code Online (Sandbox Code Playgroud)
但是,不是获取组中的用户数,而是将此数字乘以表中所有用户的数量,生成的ORM请求如下所示:
Hibernate: select count(*) as col_0_0_ from app_user user0_ cross join app_user user1_ where user1_.user_group=1
Run Code Online (Sandbox Code Playgroud)
编辑:
这是我的用户模型:
public class User {
private String userFirstName;
private String userLastName;
/* some stuff */
@ManyToOne
private Group userGroup;
}
Run Code Online (Sandbox Code Playgroud)
我的组模型有一个用@Id和named id注释的int属性.在这种情况下,如何获取组ID的用户数?
我正在使用JPA + spring开发Web应用程序。我的项目层结构是Web->服务-> DAO-> GenericDAO。所有类均以单例spring bean实例化。GenericDAO正在使用@PersistenceContext注入entityManager的实例。
我的应用程序获取http会话中存储的域实体。在对那些实体执行任何数据库操作之前,需要使用合并将其重新连接到实体管理器。我想知道将实体合并到实体管理器的最佳方法。当前,每次调用事务方法时,我都会调用genericDAO.merge(object)。例如
@Transactional
public void addProducts() {
Order order = getOrderFromHttpSession();
genericDAO.merge(order);
// delete existing products
// add new products
// other db operations.
}
Run Code Online (Sandbox Code Playgroud)
还有其他更好的方法可以做到这一点。有任何设计模式可用于此吗?
Hibernate有一个无状态版本的会话:JPA EntityManager是否存在类似的东西?即一个不使用第一级缓存的EntityManager?
我一直在Spring MVC中工作,完全不知道我在做什么.我正在尝试使用entityManager从数据库中检索对象(或记录)列表.我的方法似乎没有做任何事情:
@Override
public List<Module> sortStatus(String status) {
String queryString = "SELECT id, title, description, credit, minimumScore, daysToComplete, status, deleted FROM Module where status='"
+ status + "'";
Query query = entityManager.createQuery(queryString);
return (List<Module>) query.getResultList();
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试根据该查询字符串返回"模块"列表,但它似乎没有执行.我发现有关此问题的文档和解决方案对于我的初学者理解非常复杂.关于为什么没有发生任何事情的任何简单解释将非常感激.
[编辑]:持久性文件:
<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
version="2.0">
<persistence-unit name="trainingDatabase">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.oreillyauto.javawebtraining.domain.Module</class>
<class>com.oreillyauto.javawebtraining.domain.TrainingEntry</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.DB2400Dialect" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider" />
<property name="hibernate.jdbc.batch_size" value="30" />
<property name="hibernate.max_fetch_depth" value="30" />
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud) 我正在使用JPA 2.1,我有这样的事情
public class EntityManagerProducer {
@Produces
@PersistenceContext(unitName="first_PU")
private EntityManager em;
...
Run Code Online (Sandbox Code Playgroud)
如何动态修改unitNamein @PersistenceContext(unitName = "somer_PU")以使用其他实体管理器?这可能吗?
非常重要的更新
我有一个已部署的应用程序,persistence.xml看起来像这样:
<persistence-unit name="db1" transaction-type="JTA">
<jta-data-source>java:/jboss/datasources/PostgresDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.cache.use_second_level_cache" value="false"/>
<property name="hibernate.jdbc.batch_size" value="50"/>
<property name="hibernate.jdbc.batch_versioned_data" value="true"/>
<property name="hibernate.order_inserts" value="true"/>
<property name="hibernate.order_updates" value="true"/>
<property name="hibernate.generate_statistics" value="true"/>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="jboss.entity.manager.jndi.name" value="java:app/entitymanager/db1"/>
<property name="jboss.entity.manager.factory.jndi.name" value="java:app/entitymanagerfactory/db1"/>
</properties>
Run Code Online (Sandbox Code Playgroud)
在运行时,可以修改persistence.xml并添加另一个持久性单元,但我需要一种方法来通过传递持久性单元的名称来获取我需要的实体管理器,然后将其用于我想要的内容.然后我可以提供另一个持久性单元的名称,并获得一个不同的实体管理器.当然我希望交易过程仍然是容器管理的.
entitymanager ×10
jpa ×7
hibernate ×4
java ×4
ejb ×2
jpa-2.0 ×2
persistence ×2
cdi ×1
merge ×1
spring ×1
spring-mvc ×1
sql ×1
stateless ×1
transactions ×1