我是JPA/OpenJPA的新手,我注意到如果我EntityManager.clear()在持久化实体之后不调用,我会得到一个OutOfMemoryError(我继续在循环中添加新实体).我不确定这是否是预期的行为,或者只是OpenJPA 1.2.1故障.
那么,我是否需要自己明确分离实体?如果我不是,那么这是一个很好的做法?
我们需要确保在JPQL查询中仅返回过去30天内的结果.一个例子如下:
Date now = new Date();
Timestamp thirtyDaysAgo = new Timestamp(now.getTime() - 86400000*30);
Query query = em.createQuery(
"SELECT msg FROM Message msg "+
"WHERE msg.targetTime < CURRENT_TIMESTAMP AND msg.targetTime > {ts, '"+thirtyDaysAgo+"'}");
List result = query.getResultList();Run Code Online (Sandbox Code Playgroud)
这是我们收到的错误:
<openjpa-1.2.3-SNAPSHOT-r422266:907835 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: An error occurred while parsing the query filter 'SELECT msg FROM BroadcastMessage msg WHERE msg.targetTime < CURRENT_TIMESTAMP AND msg.targetTime > {ts, '2010-04-18 04:15:37.827'}'. Error message: org.apache.openjpa.kernel.jpql.TokenMgrError: Lexical error at line 1, column 217. Encountered: "{" (123), after : "" … 根据Java Persistent/Locking wikibooks*,处理锁的最佳方法是向用户报告Optimistic Lock Error/Exception.
问题是它不可扩展.假设我有很多用户可能会使用相同的操作导致锁定.用户不关心锁定错误消息.
简而言之 :
*
处理乐观锁定异常
不幸的是程序员经常会因为自己的利益而过于聪明.使用乐观锁定时出现的第一个问题是在发生OptimisticLockException时要执行的操作.友好邻居超级程序员的典型反应是自动处理异常.他们将只创建一个新事务,刷新对象以重置其版本,并将数据合并回对象并重新提交.Presto问题解决了,或者是吗?
这实际上首先打破了整个锁定点.如果这是你想要的,你也可以不使用锁定.不幸的是,很少会自动处理OptimisticLockException,你真的需要打扰用户这个问题.您应该向用户报告冲突,并且说"您的抱歉但发生编辑冲突并且他们将不得不重做他们的工作",或者在最好的情况下,刷新对象并向用户显示当前数据和他们提交的数据并帮助他们合并两者.
一些自动合并工具将比较数据的两个冲突版本,如果没有单个字段冲突,那么数据将在没有用户帮助的情况下自动合并.这是大多数软件版本控制系统所做的.不幸的是,用户通常能够更好地决定何时出现冲突而不是程序,只是因为.java文件的两个版本没有改变相同的代码行并不意味着没有冲突,第一个用户可能已经删除了另一个用户添加了一个引用方法的方法,以及导致典型的每晚构建经常中断的几个其他可能的问题.
我需要我的数据按空排序而不是空排序。像下面这样:
Column A
null
null
null
8
10
5
Run Code Online (Sandbox Code Playgroud)
这意味着一旦所有空值都在顶部,其余的值根本不应该被排序并按原样出现。任何想法如何使用 jpa 查询/本机查询来完成。
我有一个问题,我不能持久或合并一个只包含一个ID和一组其他对象的对象.如果我添加另一个字段,它将正常提交事务.此外,如果我将ID生成策略更改为AUTO,它也将起作用.
我团队的其他成员使用"IDENTITY"代替"AUTO",所以我希望与他们保持一致.他们的实体不仅仅是一个ID + Collection,所以它适用于他们.以下是我想要做的工作:
@Entity
public class Filter implements Serializable {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private Long id;
@OneToMany( fetch = FetchType.EAGER, orphanRemoval = true, cascade = { CascadeType.ALL } )
private ArrayList<Rule> rules = new ArrayList<>();
public Filter() {
}
}
Run Code Online (Sandbox Code Playgroud)
错误信息:
org.apache.openjpa.persistence.PersistenceException: ERROR: syntax error at or near ")"
Position: 25 {prepstmnt 693640431 INSERT INTO Filter () VALUES ()} [code=0, state=42601]
FailedObject: middle.ware.Filter@630cd05
Run Code Online (Sandbox Code Playgroud)
本质上,因为它只是一个ID和一个连接表,它在尝试持久化或合并Filter而没有任何字段时就会死掉.
解决方法
将GenerationType.IDENTITY更改为GenerationType.AUTO.
- 唯一的骗局似乎是初始启动主键跳转50,然后它开始递增1.
将GenerationType更改为TABLE
- 这似乎是AUTO选择的.
向实体添加任意字段(即String test ="test").
- 简单地让实体再增加一个字段使其持久化.但是,我不需要这个领域; …
在我的项目早期,我使用了Hibernate 3.3.2,openJPA 2.1.1的组合来连接数据库并从表中检索信息.现在我想删除Hibernate并使用openJPA进行连接并检索信息.
我之前的persistence.xml配置是
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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 persistence_2_0.xsd">
<persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.connection.url" value="jdbc:mysql://10.10.10.10:3306/test?autoReconnect=true"/>
<property name="hibernate.connection.username" value="user"/>
<property name="hibernate.connection.password" value="pwd"/>
<property name="hibernate.generate_statistics" value="true"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.OSCacheProvider"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.c3p0.min_size" value="5"/>
<property name="hibernate.c3p0.max_size" value="20"/>
<property name="hibernate.c3p0.timeout" value="1800"/>
<property name="hibernate.c3p0.max_statements" value="50"/>
<property name="hibernate.c3p0.idle_test_period" value="1800"/>
<property name="c3p0.idleConnectionTestPeriod" value="1810"/>
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
现在我想转到openJPA 2.1.1,为此我的persistence.xml文件是
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" …Run Code Online (Sandbox Code Playgroud) 默认情况下,OpenJPA的postgres字典VARCHAR(255)为String没有规定长度的字段生成.它可以设置为生成VARCHAR或TEXT替代所有这些字段,以便我不需要在@Column(columnDefinition = "TEXT")任何地方重复?当然,如果明确给出长度,例如@Column(length = 128),结果应该是VARCHAR(128).就此而言,其他任何JPA提供商都允许这样做吗?
我目前正在研究Felix的OSGi项目(v4.0.3).我需要使用JPA,所以我安装了Apache Aries JPA包.我还安装了OpenJPA,我需要它使用MySQL Connector Bundle连接到MySQL数据库.不幸的是它不起作用,OpenJPA说它无法找到MySQL JDBC类,我无法弄清楚什么是坏的,也许我做错了.我将在下面解释我安装的内容以及persistence.xml文件和我得到的实际异常.
这是我安装的Apache Aries软件包列表:
然后我安装了那些Apache Aries JPA包的依赖项.我从Springsource下载了它们:
我还安装了OpenJPA及其所有依赖项.我在apache-openjpa-2.2.0下载文件夹的lib文件夹中找到了bundle 2到5(commons-*).我在这里下载了Serp ,因为在lib文件夹中找到的jar不是OSGi包.最后我找到了Springsource中的最后两个包(#7和#8):
一旦我最终安装了OpenJPA,我仍然需要MySQL JDBC Driver包,我也从Springsource存储库获得了它的commons-logging依赖:
现在,此时安装的软件包列表变得非常庞大.我说我安装了OpenJPA,但这只是因为我无法弄清楚如何使用任何其他提供商与Aries.我最初想使用EclipseLink,但显然Apache Aries没有检测到它作为提供者,根据这个博客,你必须制作另一个包含你自己的激活器的包,让Aries注意到EclipseLink.我尝试了但它没有用,所以我又回到了使用OpenJPA.
所以现在我有两个问题:
或者:
这是我使用的persistence.xml文件:
<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" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="userManager.model" transaction-type="RESOURCE_LOCAL">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>org.project.dao.entity.UserEntity</class>
<properties>
<property name="openjpa.ConnectionDriverName" value="com.mysql.jdbc.Driver" />
<property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/usermanager?autoReconnect=true" />
<property name="openjpa.ConnectionUserName" value="root" />
<property …Run Code Online (Sandbox Code Playgroud) 我编写了一个带有Field LoginId和Password的权限类.
Iam使用AES_ENCRYPT加密passwrd并在db中加载它.
我想只检索解密的密码.所以,我在OPen JPA 2.0中使用NAEDQueryis使用AES_DECRYPT.
我写的查询是:
Query q = em.createNativeQuery("select AES_DECRYPT(l.password,?2) from loginDetails l where l.loginID = ?1");
q.setParameter(1, loginId);
q.setParameter(2, getKey());
String s = q.getSingleResult();
Run Code Online (Sandbox Code Playgroud)
但我得到以下例外:
java.lang.ClassCastException: [B cannot be cast to java.lang.String
at com.rcs.chef.validation.UserValidation.decryptedPasswordForID(UserValidation.java:99)
at com.rcs.chef.validation.UserValidation.validateUser(UserValidation.java:81)
at com.rcs.chef.validation.UserValidation.activate(UserValidation.java:72)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.aries.blueprint.utils.ReflectionUtils.invoke(ReflectionUtils.java:226)
at org.apache.aries.blueprint.container.BeanRecipe.invoke(BeanRecipe.java:824)
at org.apache.aries.blueprint.container.BeanRecipe.runBeanProcInit(BeanRecipe.java:636)
at org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:724)
at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:64)
at org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:219)
at org.apache.aries.blueprint.container.BlueprintRepository.createAll(BlueprintRepository.java:147)
at org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEagerComponents(BlueprintContainerImpl.java:640)
at org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:331)
at org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:227)
Run Code Online (Sandbox Code Playgroud)
我甚至试过这个:
Query q = em.createNativeQuery("select AES_DECRYPT(l.password,?2) from loginDetails l where …Run Code Online (Sandbox Code Playgroud) 我有一个Oracle函数,它接受一个POINTS%ROWTYPE表.我想使用CriteriaBuilder类从JPA调用此函数,该类具有数据库函数的功能.当我尝试构建查询时,它会死于抱怨ArrayLists不是函数的有效查询参数.
如何将ArrayList中的ArrayList传入Oracle函数?
Oracle函数签名:
CREATE OR REPLACE FUNCTION LOCATION_CONTAINS
(
LATITUDE_IN IN DOUBLE PRECISION,
LONGITUDE_IN IN DOUBLE PRECISION,
points IN types_pkg.point_array,
numPoints IN INTEGER
)
Run Code Online (Sandbox Code Playgroud)
Oracle类型:
create or replace package types_pkg
as
type point_array is table of FILTERPOINT%ROWTYPE;
end types_pkg;
Run Code Online (Sandbox Code Playgroud)
JPA Criteria Builder调用
List<FilterPoint> points = getPoints(location_name);
int numPoints = points.size();
Expression ex =
cb.function( "LOCATION_CONTAINS",
Integer.class,
entity.get( "latitude" ),
entity.get( "longitude" ),
cb.literal( points ),
cb.literal( numPoints ) );
Run Code Online (Sandbox Code Playgroud)
例外:
org.apache.openjpa.persistence.ArgumentException:
The specified parameter of type "class middle.ware.FilterPoint" is not …Run Code Online (Sandbox Code Playgroud) openjpa ×10
jpa ×7
java ×5
postgresql ×2
aries ×1
database ×1
jdbc ×1
jpa-2.0 ×1
jpql ×1
locking ×1
memory-leaks ×1
mysql ×1
oracle ×1
osgi ×1
persistence ×1
plsql ×1
spring-data ×1