我们是JPA的新手,并试图建立一个非常简单的一对多关系,其中一个叫做Message的pojo可以有一个由连接表定义的整数组id的列表GROUP_ASSOC.这是DDL:
CREATE TABLE "APP"."MESSAGE" (
"MESSAGE_ID" INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)
);
ALTER TABLE "APP"."MESSAGE" ADD CONSTRAINT "MESSAGE_PK" PRIMARY KEY ("MESSAGE_ID");
CREATE TABLE "APP"."GROUP_ASSOC" (
"GROUP_ID" INTEGER NOT NULL,
"MESSAGE_ID" INTEGER NOT NULL
);
ALTER TABLE "APP"."GROUP_ASSOC" ADD CONSTRAINT "GROUP_ASSOC_PK" PRIMARY KEY ("MESSAGE_ID", "GROUP_ID");
ALTER TABLE "APP"."GROUP_ASSOC" ADD CONSTRAINT "GROUP_ASSOC_FK" FOREIGN KEY ("MESSAGE_ID")
REFERENCES "APP"."MESSAGE" ("MESSAGE_ID");
这是pojo:
@Entity
@Table(name = "MESSAGE")
public class Message {
@Id
@Column(name = "MESSAGE_ID")
@GeneratedValue(strategy …Run Code Online (Sandbox Code Playgroud) 我是EJB 3和JPA的新手.
我在appserver中创建了一个数据源jdbc/AppDataSource.默认持久性提供程序保留为com.ibm.websphere.persistence.PersistenceProviderImpl.我将默认的jta数据源JNDI名称保留为AppDataSource自身.我对JTA和非JTA感到困惑.它们的区别是什么?
我生成了实体并EntityTransaction在bean中创建了一个对象.在调用persist()和commit()方法时,我收到一个错误:
javax.ejb.EJBException: See nested exception; nested exception is: <openjpa-1.2.1-SNAPSHOT-r422266:686069 fatal user error> org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property.
Caused by: <openjpa-1.2.1-SNAPSHOT-r422266:686069 fatal user error> org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property.
Run Code Online (Sandbox Code Playgroud)
openjpa如何在这里展示?
截至目前,我只persistence.xml包含实体类名称.
如何使其使用数据源的默认appserver值.或者我怎样才能提供jpa提供者和数据源详细信息的详细信息persistence.xml?
请提供您的意见.
我正在使用JPQL检索数据.我可以使用该语句获取数据
List persons = null;
persons = em.createQuery("select p.albumName from PhotoAlbum p , Roleuser r
where r = p.userId and r.userID = 1");
Run Code Online (Sandbox Code Playgroud)
现在我可以使用这个来获取相册名称:
int i=0;
for (i=0;i<persons.size(); i++)
{
System.out.println("Testing n "+ i +" " + persons.get(0));
}
Run Code Online (Sandbox Code Playgroud)
现在我想获取相册名称和roleuser的行名称 firstname
我正在使用查询
persons = em.createQuery("select r.firstName , p.albumName from PhotoAlbum p ,
Roleuser r where r = p.userId and r.userID = 1").getResultList();
Run Code Online (Sandbox Code Playgroud)
现在如何获取行firstname和albumname作为persons.get(0)返回一个对象
通过运行代码:
for (i=0;i<persons.size(); i++)
{
//r = (Roleuser) persons.get(i);
System.out.println("Testing n "+ i +" " …Run Code Online (Sandbox Code Playgroud) 我想不使用内置的Websphere 7 jpa插件,而是使用应用程序WEB-INF/lib/open-jpa 2和专有的持久性提供程序.我无法为Websphere安装OSGI和JPA 2功能包.
最初,我只是尝试加载persistence.xml(版本="2"不支持)时收到sax解析错误.该错误是由open-jpa 1.2.3中的类抛出的.当我运行websphere/appserver/bin/wsjpaversion.bat时,会显示open-jpa 1.2.3 jar.默认情况下,它会覆盖应用程序中的open-jpa 2 jar.我创建了一个包含open-jpa 2 jar的共享库,并检查了这个配置选项:'为这个共享库使用一个独立的类加载器'.我将应用程序类加载器设置为最后加载父类,并为其分配新的共享库资源."版本2"错误消失了,但还有另一个问题.当我尝试初始化EntityManager时,我收到一个错误:
Caused by: javax.persistence.PersistenceException: Failed to load provider from META-INF/services
at javax.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver.getPersistenceProviders(PersistenceProviderResolverHolder.java:121)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:91)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
... 2 more
Caused by: java.lang.ClassCastException: com.ibm.websphere.persistence.PersistenceProviderImpl incompatible with javax.persistence.spi.PersistenceProvider
at javax.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver.getPersistenceProviders(PersistenceProviderResolverHolder.java:110)
... 11 more
Run Code Online (Sandbox Code Playgroud)
还有一个细节:在persistence.xml中,provider元素设置为专有的PersistenceProviderImpl而不是默认的Websphere持久性提供程序.那么这个websphere默认来自何处以及如何防止它?(另一个重要的注意事项:当我完全删除persistence.xml时,我得到了同样的错误)
谢谢
我的Java EE 6应用程序使用slf4j作为日志记录框架的logback.现在我想将OpenJpa的SQL跟踪添加到我的日志文件中.OpenJpa-Documentation说,我可以使用一个参数:
<property name="openjpa.Log" value="slf4j"/>
Run Code Online (Sandbox Code Playgroud)
我将WebSphere Application Server v8.0.0.1用作Java EE容器.如果我将我的应用程序部署到服务器,则此参数不会更改任何内容.我可以在WebSphere Admin Console中更改日志级别,这样可以正常工作.但是一个无法绕过OpenJpa日志记录到我的slf4j框架.
有没有人使用这样的配置并解决了这个问题?
顺便说一句.我知道,信息中心 - 文章http://publib.boulder.ibm.com/infocenter/wasinfo/v8r0/index.jsp?topic=%2Fcom.ibm.websphere.nd.doc%2Finfo%2Fae%2Fae%2Ftejb_jpatroubleshoot .html 说,该参数将被忽略,但一切都应该可以,呃?
我可以在JPQL上做这样的事吗?
SELECT NEW com.MyDTO(p.a, p.b, q.c, q.d)
FROM
(SELECT r.* FROM MyDTO1 r ) p
LEFT OUTER JOIN
(SELECT s.* FROM MyDTO2 s ) q
ON p.x = q.y
Run Code Online (Sandbox Code Playgroud)
或者类似的?(上面的查询混合了native和JPQL,所以不要误解)
我觉得这个部分有问题.
FROM
(SELECT r.* FROM MyDTO1 r ) p
Run Code Online (Sandbox Code Playgroud)
当我试图执行时,我收到了这个错误.
Exception Description: Syntax error parsing the query [.....], unexpected token [(]
Run Code Online (Sandbox Code Playgroud)
谢谢!
对于OpenJPA,如何在jta_datasource中指定JNDI连接而不在persistence.xml中指定用户名和密码?如果在jandi的persistence.xml文件中没有指定用户名和密码,则会给出错误.
我有一些Java实体类在我的生产代码中运行良好.我正在为这个应用程序编写一个自动化测试,我正在重用同一个类.
当测试应用程序以这种方式创建其实体管理器时:
Properties props = new Properties();
props.setProperty("provider", "org.apache.openjpa.persistence.PersistenceProviderImpl");
props.setProperty(...);
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("foobar-upgrade-restful-test", props);
EntityManager entityManager = entityManagerFactory.createEntityManager();
Run Code Online (Sandbox Code Playgroud)
应用程序抛出一条错误消息,告知:
Caused by: <openjpa-2.2.0-r422266:1244990 fatal user error> org.apache.openjpa.persistence.ArgumentException: You have supplied columns for "com.foo.bar.server.commontypes.job.CompositeJob", but this mapping cannot have columns in this context.
at org.apache.openjpa.jdbc.meta.MappingInfo.assertNoSchemaComponents(MappingInfo.java:382)
at org.apache.openjpa.jdbc.meta.strats.FlatClassStrategy.map(FlatClassStrategy.java:51)
at org.apache.openjpa.jdbc.meta.ClassMapping.setStrategy(ClassMapping.java:392)
at org.apache.openjpa.jdbc.meta.RuntimeStrategyInstaller.installStrategy(RuntimeStrategyInstaller.java:56)
at org.apache.openjpa.jdbc.meta.MappingRepository.prepareMapping(MappingRepository.java:411)
at org.apache.openjpa.meta.MetaDataRepository.preMapping(MetaDataRepository.java:762)
at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:651)
... 72 more
Run Code Online (Sandbox Code Playgroud)
我并不是真的理解错误消息,因为同一个实体bean在Glassfish下的应用程序中工作,而persistence.xml也几乎相同.(在测试中我使用RESOURCE_LOCALtx而不是JTA,但我怀疑它与此错误有关.
你知道什么是错的吗?
目前我正在将新的JPA实体映射到旧数据库.数据库中的列名称使用下划线分隔列名称,如"my_column_name".
问题是JPA默认使用camel case.
// Will be 'myColumnName' in queries and generated databases
private String myColumnName;
Run Code Online (Sandbox Code Playgroud)
我知道可以在属性上添加@Column(name ="..")或@JoinColumn(name ="...") - 但这意味着我必须将它添加到所有实体中的每个属性.
@Column(name = "my_column_name")
private String myColumnName;
Run Code Online (Sandbox Code Playgroud)
是否可以更改JPA的默认行为以使用'my_column_name'而不是'myColumnName'?
我用OpenJPA 2.4.0了MySQL
我有3个表- ,meeting,.locationmeeting_location
meeting_location是一个连接表,它有1个外键meeting,2到location- main_location_id和secondary_location_id.
我使用以下参数初始化表,然后尝试从meeting表中删除该条目.
id loc_name
------ ------------
0 location 0
1 location 1
2 location 2
3 location 3
4 location 4
5 location 5
6 location 6
7 location 7
8 location 8
9 location 9
id name
------ -----------
1 meeting 1
id meeting_id main_location_id secondary_location_id name
------ ---------- ---------------- --------------------- --------
1 1 4 9 (NULL) …Run Code Online (Sandbox Code Playgroud)