我们的DAO层有19种方法,每种方法都有一些变化:
public TicketProp saveTicketProp(TicketProp prop) {
EntityManager em = this.emf.createEntityManager();
try {
em.getTransaction().begin();
prop = (TicketProp) em.merge(prop);
em.getTransaction().commit();
return prop;
} finally {
em.close();
}
}
Run Code Online (Sandbox Code Playgroud)
含义:在每个方法中,我们处理自己的事务并在finally块中关闭它.我们正在测试Jersey应用程序,因此我们的JUnit测试扩展了JerseyTest.每个测试方法都实例化一个Grizzly容器,运行测试,然后关闭容器.EntityManagerFactory由spring注入.我们使用JPA而不是Hibernate.
我正在监视与MySQL测试数据库的连接,它们总是很高.一个测试单独运行MySQL"Max_used_connections"变量为38.为了好玩,我去了所有em.close()调用注释,测试仍然使用38个连接.
我正在使用Hibernate的内置连接池(我知道不是用于prod使用).我仍然期待某种智能池化.
我处理EntityManager错了吗?我怎么能关闭连接?
我有几个关于在 JavaSE 环境中使用实体管理器的问题。
我正在使用存储库模式对数据库执行我的 CRUD 操作。将有一个基本存储库类,如下所示:
public class Repository<T> implements IRepository<T> {
private EntityManager em;
private String persistenceUnitName;
public Repository(String persistenceUnitName) {
this.persistenceUnitName = persistenceUnitName;
}
@Override
public T find(Class<T> type, Object id) {
return em.find(type, id);
}
private EntityManager getEntityManager() {
if (this.em == null) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistenceUnitName);
em = emf.createEntityManager();
}
return em;
}
...
...
}
Run Code Online (Sandbox Code Playgroud)
然后,我将拥有像 EmployeeRepository 这样将继承 Repository 的类。这些存储库类将在我的服务层中创建。
这是初始化实体管理器的好方法吗?我开始认为它不是 - 似乎每个持久性单元应该只有一个实体管理器?在这种情况下,您创建的每个存储库都有一个实体管理器……您将如何确保每个持久性单元只有一个实体管理器?另外,我注意到实体管理器和实体管理器工厂方法有一个关闭方法 - 什么时候应该调用它们?在服务器终止事件上?
如果您知道有关在 JavaSE 中使用 JPA 的任何好的资源,我将不胜感激。
谢谢!
文件EntityManager.persist()说它会Make an instance managed and persistent.
它将实体持久化到数据库,但是当我调用该EntityManager.contains()方法来检查我刚刚持有的实体是否被管理时,它返回false.
我只想知道为什么会这样?也许有些东西我无法做到或者我忽略了什么?
建议将不胜感激:D
我试图在级联中保存一些对象并检索它。我有3个对象超过3个实体。
实体:
class Order
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var object $basket
*
* @ORM\OneToOne(targetEntity="Entity\Basket", inversedBy="order")
*/
protected $basket;
...
}
class Basket
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var array $declinations
*
* @ORM\OneToMany(targetEntity="Entity\BasketDeclination", mappedBy="basket")
*/
protected $declinations;
/**
* Order owner (reversed side)
*
* @var OrderClient $order
*
* @ORM\OneToOne(targetEntity="Entity\Order", …Run Code Online (Sandbox Code Playgroud) 我正在编写一个具有典型两个实体的应用程序:用户和用户组。后者可能包含前者的一个或多个实例。我有以下(更多/更少)映射:
用户:
public class User {
@Id
@GeneratedValue
private long id;
@ManyToOne(cascade = {CascadeType.MERGE})
@JoinColumn(name="GROUP_ID")
private UserGroup group;
public UserGroup getGroup() {
return group;
}
public void setGroup(UserGroup group) {
this.group = group;
}
}
Run Code Online (Sandbox Code Playgroud)
用户组:
public class UserGroup {
@Id
@GeneratedValue
private long id;
@OneToMany(mappedBy="group", cascade = {CascadeType.REMOVE}, targetEntity = User.class)
private Set<User> users;
public void setUsers(Set<User> users) {
this.users = users;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我为每个实体(UserDao 和 UserGroupDao)都有一个单独的 DAO 类。我所有的 DAO 都使用 @PersistenceContext 注释注入了 EntityManager,如下所示:
@Transactional
public class SomeDao<T> { …Run Code Online (Sandbox Code Playgroud) 我使用的是Spring 3.1.1.RELEASE,Hibernate 4.1.0.Final,JUnit 4.8和JPA 2.0(hibernate-jpa-2.0-api).我正在尝试根据成员字段的字段编写查询和搜索.我的意思是我有这个实体......
@GenericGenerator(name = "uuid-strategy", strategy = "uuid.hex")
@Entity
@Table(name = "cb_organization", uniqueConstraints = {@UniqueConstraint(columnNames={"organization_id"})})
public class Organization implements Serializable
{
@Id
@NotNull
@GeneratedValue(generator = "uuid-strategy")
@Column(name = "id")
/* the database id of the Organization */
private String id;
@ManyToOne
@JoinColumn(name = "state_id", nullable = true, updatable = false)
/* the State for the organization */
private State state;
@ManyToOne
@JoinColumn(name = "country_id", nullable = false, updatable = false)
/* The country the Organization is in …Run Code Online (Sandbox Code Playgroud) 我有一个问题需要理解容器管理和应用程序管理的实体管理器之间的差异?
如果你能给我一个说明差异的例子,我将非常感激.
我有大约10个EntityManagers的Java EE应用程序(EM的数量可能会增加).我的应用程序还包含许多无状态,有状态和消息驱动的bean.
@PersistenceContext我可能会将所有内容存储在一个单独的bean中,并使用其他bean访问它,而不是在每个bean中注入我的EM (以及两种方法来检测用户使用哪个EM).像这样,不用担心可维护性.
然而,将EM存储在一个单独的bean中是否是线程安全的?瓶颈会出现吗?
另一个解决方案是创建一个抽象类,所有bean都将扩展它.
什么是更好的解决方案?
我正在开发一个带有spring框架的项目.我有以下架构:所有数据库代码都在dao类中,所有应用程序逻辑都在服务类中,http请求使用spring mvc rest controllers进行处理.
@Repository
public class UserDao {
@PersistenceContext
private EntityManager em;
public void editUser(User user) {
...
}
}
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Transactional
public void editUser(User user) {
...
}
}
@RestController
@RequestMapping(value = "/UserCtrl", produces = "application/json;charset=UTF-8")
public class UserCtrl {
private static final Logger logger = LogManager.getLogger(AppConfig.LOGGER_NAME);
@Autowired
private ApplicationContext appContext;
@RequestMapping(value = "/editUser")
public ActionResult editUser(@ModelAttribute User user) {
ActionResult rslt = new ActionResult();
try {
UserService userService = …Run Code Online (Sandbox Code Playgroud) 我试图从JPA的EntityManager中获取Hibernate的SessionFactory,方法如下:
@PersistenceContext
EntityManager manager;
public SessionFactory getSessionFactory(){
sessionFactory = manager.unwrap(SessionFactory.class);
}
Run Code Online (Sandbox Code Playgroud)
但是它抛出了这个异常:
org.springframework.orm.jpa.JpaSystemException: Hibernate cannot unwrap interface org.hibernate.SessionFactory; nested exception is javax.persistence.PersistenceException: Hibernate cannot unwrap interface org.hibernate.SessionFactory
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:418)
...
Caused by: javax.persistence.PersistenceException: Hibernate cannot unwrap interface org.hibernate.SessionFactory
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.unwrap(AbstractEntityManagerImpl.java:1489)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
Run Code Online (Sandbox Code Playgroud)
这可能是什么原因?
提前致谢
entitymanager ×10
jpa ×7
java ×6
hibernate ×4
jpa-2.0 ×2
spring ×2
concept ×1
doctrine-orm ×1
jersey ×1
jta ×1
mysql ×1
persistence ×1
spring-orm ×1
symfony ×1
transactions ×1