有没有办法在不编辑实体对象的情况下在单个方法上更改JPA fetch类型?
我有一个由JPA实体类组成的共享ORM层.该ORM层由两个DAO层访问.一个DAO需要延迟抓取,因为它适用于我的Web应用程序,另一个需要急切的抓取,因为我需要它是线程安全的.
这是我的线程安全DAO的示例方法,
@PersistenceContext(unitName = "PersistenceUnit", type = PersistenceContextType.TRANSACTION)
private EntityManager em;
public ErrorCode findErrorCodeById(short id) {
return (ErrorCode) em.createNamedQuery("ErrorCode.findById").
setParameter("id", id).getSingleResult();
}
Run Code Online (Sandbox Code Playgroud)
我如何使这个方法(或整个类)使用渴望获取?
如何使表user_roles将两列(userID,roleID)定义为复合主键.应该很容易,只是记不住/找不到.
在user实体中:
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "user_roles")
public List<RoleDAO> getRoles() {
return roles;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getUserID() {
return userID;
}
Run Code Online (Sandbox Code Playgroud)
在roles实体中:
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "user_roles")
public List<UserDAO> getUsers() {
return users;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getRoleID() {
return roleID;
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
**更多信息
因此,有一个第三表user_roles即花费(由上述自动生成)userID从user实体和roleID从roles实体.现在我需要生成的table(user_roles)中的这两列是一个复合主键.
我正在寻找类似iPhone上的钥匙串,但适用于Android开发.
使我有可能保存小键值对的东西,即使用户重新安装应用程序也是持久且不变的.
有类似的东西吗?我可以这样使用标准首选项吗?
我希望以某种方式实现一种行为,它可以在PC上将游戏写入另一个文件夹,以便在删除后再重新安装它们不会丢失.
编辑
赏金耗尽,没有人提到accountManager.我偶然发现了它.这不是实现我所描述的行为的方法吗?
我决定在创建视图助手类时使用单例设计模式.这让我思考; 单例实例是否会在请求中存活?这导致了另一个问题,哪些变量(如果有的话)在Web请求中存活,并且这取决于部署?(Fastcgi,Mongrel,Passenger,......)
我知道Controller实例变量没有持久化.我知道常量是持久的(或重新加载?).但我不知道类变量,类上的实例变量,Eigenclasses,......
我是网络编程的新手,我过去主要使用java来创建桌面应用程序.
我试图找出如何在PHP中创建持久对象.也许持久性不是正确的词,我不希望对象对每个客户端都是唯一的,就像我通过在会话变量中序列化它一样.我希望在服务器上创建对象,并始终可以访问同一个对象.该对象将查询数据库并存储一些数据.这样,每个页面加载,php代码将从同一个持久对象获取该数据,而不是每次都必须查询数据库.
我目前正在使用单例模式进行对象创建,因为我最初的理解是它可以让我完成我想要的.部分对象是一个数组,当我执行一个向数组添加值的php页面,并在同一页面上访问该值时,它很好.但是,当我向数组添加一个值,然后加载另一个访问该值的页面时,该数组将返回为空.
这可能吗?我是否过度反应认为查询数据库这么多是不好的?在任何一秒钟内,有时会有多达20个用户请求数据,我觉得每次查询数据库都是荒谬的.
谢谢
在smalltalk中,您可以将世界状态保存到图像文件中.我认为这与Smalltalk自身"序列化"的能力有关 - 也就是说,对象可以生成自己的源代码.
1)这是一个准确的理解吗?
2)将这种能力添加到现代语言中的挑战是什么(非lisp,显然)?
3)"序列化"是正确的词吗?什么是正确的行话?
我目前正在为我的应用程序使用Redis,它的功能非常适合我的应用程序(列表,集合,排序集等).
我的应用程序在很大程度上依赖于排序集,列表,集合.和他们相关的功能(推送到列表,获取列表,集合的联合等.我现在面临的唯一问题是我的数据很大,我的大部分数据都不需要在内存中,我想要将它们存储在磁盘上.
**我需要一个带有redis数据结构的磁盘数据库**
我读到了Cassandra,但我不确定它是否支持排序集,集,列表.或者至少如果确实如此,我找不到像Redis那样操纵它们的方法.
谢谢.
在执行ASP.NET站点(例如ASP.NET MVC站点)时创建测试持久层的最佳实践是什么?
我见过的很多例子都在单元测试项目中使用了Moq(或其他模拟框架),但我想,像moq我的持久层,以便我的网站显示数据和内容,但它不是来自数据库.我想做到最后.我见过的所有嘲弄的东西只存在于单元测试中.
当人们想要(stub?)伪造一个持久层来快速快速开发时,人们会采取什么样的做法?我使用依赖注入来处理它,并为我的持久层提供一些硬编码结果(这实际上是手动和无聊的).
其他人在做什么?示例和链接会很棒:)
只是一点点更新:到目前为止,我已经获得了一个假的存储库和一个SQL存储库 - 每个类实现一个接口.然后,使用DI(我正在使用StructureMap),我可以在我的虚拟存储库或SQL存储库之间切换.到目前为止,它运作良好:)
(也是可怕的想到我差不多11个月前问过这个问题,从我编辑这个问题开始,现在!)
从Pro EJB3 JPA一书中:
在使用JPA的Java EE应用程序中处理此(-update实体)的最常见策略是将更改的结果放入分离的实体实例中,并将挂起的更改合并到持久性上下文中,以便将它们写入数据库
例如: 该EMP参数是分离实体
@Stateless
public class EmployeeServiceBean {
@PersistenceContext
EmtityManager em;
public void updateEmployee(Employee emp){
if(em.find(Employee.class, emp.getId()) == null){
throw new IllegalArgumentException("Unknown Employee id")
}
em.merge(emp);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,说:
如果使用的信息量非常小,我们可以通过查找托管版本并手动将更改复制到其中来完全避免分离对象和merge()操作.
示例: 此处附有emp
public void updateEmployee(int id, String newName, long newSalary) {
Employee emp = em.find(Employee.class, id);
if(emp==null){
throw new IllegalArgumentException("Unknown Employee id")
}
emp.setEmpName(newName);
emp.setSalary(newSalary);
}
Run Code Online (Sandbox Code Playgroud)
因此,看起来像小更新和创建操作策略find()然后逐个设置新值是方便的.但是!对于数据的大更新(即集合)是首选的,有一个分离的实体和所有它的关系(与CascadeType.Merge)并做大merge().
好的,但为什么呢?
我将我的类映射到我的数据库的表,但在运行测试时,我收到以下错误:
Caused by: org.hibernate.AnnotationException: A Foreign key refering com.modulos.pvs.acceso.datos.entity.Provincia from com.modulos.pvs.acceso.datos.entity.Ciudad has the wrong number of column. should be 2
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:429)
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:115)
at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1550)
at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1473)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1389)
at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1345)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:717)
at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)
... 40 more
Run Code Online (Sandbox Code Playgroud)
这些是我的课程:
// PROVINCIA TABLE
@Entity
@Table(name="provincia")
@NamedQuery(name = "Provincia.findAll", query = "SELECT p FROM Provincia p")
public class Provincia implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private ProvinciaPK id;
private String nombreProvincia;
// …Run Code Online (Sandbox Code Playgroud) persistence ×10
jpa ×3
java ×2
android ×1
annotations ×1
asp.net ×1
controller ×1
dao ×1
database ×1
hibernate ×1
java-ee ×1
keychain ×1
many-to-many ×1
mocking ×1
nosql ×1
object ×1
orm ×1
php ×1
primary-key ×1
redis ×1
singleton ×1
smalltalk ×1
tdd ×1