Tag: jpa

JPA:如何在运行时指定与类对应的表名?

(注意:我对Java非常熟悉,但不熟悉Hibernate或JPA – 但:) 我想编写一个通过JPA与DB2 / 400数据库通信的应用程序,现在我可以获取表中的所有条目并将它们列出到System.out(使用MyEclipse进行反向工程)。 我知道@Table注释导致名称与类静态编译,但我需要能够使用一个表,其中名称和模式在运行时提供(他们的定义是相同的,但我们有很多他们)。 显然这不是那么容易做到的,我很欣赏这一点。 我目前选择Hibernate作为JPA提供程序,因为它可以处理这些数据库表没有记录。 所以,问题是,我怎样才能在运行时告诉JPA的Hibernate实现,类A对应于数据库表B? (编辑:Hibernate NamingStrategy中重写的tableName()可能允许我解决这个内在限制,但我仍然希望与供应商无关的JPA解决方案)

Java,JPA,Glassfish,无效资源:jdbc / __ default__pm

我使用Glassfish 3.1.2.2(build 5),JPA,EclipseLink,MySQL 我通过Glassfish管理面板创建了MySQL池。 从GF管理面板ping到MySQL是可以的。 我用persistence.xml创建了app: org.eclipse.persistence.jpa.PersistenceProvider 我试图部署它并得到错误: Invalid resource : jdbc/__default__pm [#|2012-11-16T02:20:59.480+0400|SEVERE|glassfish3.1.2|javax.enterprise.system.core.com.sun.enterprise.v3.server|_ThreadID=43;_ThreadName=Thread-2;|Invalid resource : jdbc/__default__pm java.lang.RuntimeException: Invalid resource : jdbc/__default__pm GF日志中的Stacktrace是巨大的。 由…开始 at com.sun.enterprise.connectors.ConnectorRuntime.lookupDataSourceInDAS(ConnectorRuntime.java:540) at com.sun.enterprise.connectors.ConnectorRuntime.lookupPMResource(ConnectorRuntime.java:469) at org.glassfish.persistence.common.PersistenceHelper.lookupPMResource(PersistenceHelper.java:63) at org.glassfish.persistence.jpa.ProviderContainerContractInfoBase.lookupDataSource(ProviderContainerContractInfoBase.java:71) …. 有没有人有想法发生了什么,该怎么办?

创建名为’entityManagerFactory的bean时出错

我试图运行dbtest但我收到以下错误: “引起:org.springframework.beans.factory.BeanCreationException:在类路径资源[root-context.xml]中定义名称为’entityManagerFactory’的bean创建错误:init方法的调用失败;嵌套exception是java.lang.AbstractMethodError: org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.getValidationMode()Ljavax /持久/ ValidationMode;” 因此我也得到以下错误: “引起:org.springframework.beans.factory.BeanCreationException:在类路径资源[root-context.xml]中定义了名为’personRepository’的bean创建错误:bean的初始化失败;嵌套exception是org.springframework.beans.factory .BeanCreationException:在类路径资源[root-context.xml]中定义名称为’entityManagerFactory’的bean时出错:init方法的调用失败;嵌套exception是java.lang.AbstractMethodError:org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo .getValidationMode()Ljavax /持久/ ValidationMode; 所以我们必须对我的根上下文文件进行检查,它看起来如下: <!– Root Context: defines shared resources visible to all other web components –> persisence.xml看起来如下: org.hibernate.ejb.HibernatePersistence 这是我的pom.xml文件: 4.0.0 se.lowdin civilforsvaret civilforsvaret-webbapp war 1.0.0-BUILD-SNAPSHOT 1.6 3.1.1.RELEASE 1.6.10 1.6.6 org.springframework spring-context ${org.springframework-version} commons-logging commons-logging org.springframework spring-webmvc ${org.springframework-version} org.aspectj aspectjrt ${org.aspectj-version} mysql mysql-connector-java 5.1.24 org.slf4j slf4j-api ${org.slf4j-version} […]

JPA使用多个数据库模式

使用JPA / Spring时遇到一个特定问题我遇到了一些麻烦: 如何动态地将模式分配给实体? 我们有TABLE1属于模式AD,TABLE2属于BD。 @Entity @Table(name = “TABLE1″, schema=”S1D”) … @Entity @Table(name = “TABLE2″, schema=”S2D”) … 模式可能不会在注释属性中进行硬编码,因为它取决于环境(Dev / Acc / Prd)。 (接受模式是S1A和S2A) 我怎样才能做到这一点? 是否可以指定某种类型的占位符: @Entity @Table(name = “TABLE1″, schema=”${schema1}”) … @Entity @Table(name = “TABLE2″, schema=”${schema2}”) … 以便根据驻留在环境中的属性文件替换模式? 干杯

Java8 Collections.sort(有时)不会对JPA返回的列表进行排序

Java8在我的JPA EclipseLink 2.5.2环境中继续做一些奇怪的事情。 我不得不删除问题https://stackoverflow.com/questions/26806183/java-8-sorting-behaviour昨天,因为在这种情况下的排序受到奇怪的JPA行为的影响 – 我通过强制执行该方法找到了解决方法在进行最终排序之前的第一个排序步骤。 仍然在Java 8中使用JPA Eclipselink 2.5.2,以下代码有时不在我的环境中排序(Linux,MacOSX,都使用build 1.8.0_25-b17)。 它在JDK 1.7环境中按预期工作。 public List getDocumentsByModificationDate() { List docs=this.getDocuments(); LOGGER.log(Level.INFO,”sorting “+docs.size()+” by modification date”); Comparator comparator=new ByModificationComparator(); Collections.sort(docs,comparator); return docs; } 从JUnit测试调用时,上述函数正常工作。 在生产环境中进行debbuging时,我会得到一个日志条目: INFORMATION: sorting 34 by modification date 但在TimSort中,nRemaining <2的返回语句被命中 – 因此不会发生排序。 JPA提供的IndirectList(请参阅jpa返回的集合? )被认为是空的。 static void sort(T[] a, int lo, int hi, Comparator c, […]

使用JPA Criteria API,您是否可以执行只获得一次连接的获取连接?

使用JPA 2.0。 似乎默认情况下(没有显式提取),在1 + N个查询中提取@OneToOne(fetch = FetchType.EAGER)字段,其中N是包含定义与不同相关实体的关系的实体的结果数。 使用Criteria API,我可能会尝试避免如下: CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery query = builder.createQuery(MyEntity.class); Root root = query.from(MyEntity.class); Join join = root.join(“relatedEntity”); root.fetch(“relatedEntity”); query.select(root).where(builder.equals(join.get(“id”), 3)); 理想情况下,上述内容应与以下内容相同: SELECT m FROM MyEntity m JOIN FETCH myEntity.relatedEntity r WHERE r.id = 3 但是,条件查询导致根表不必要地连接到相关实体表两次; 一次用于获取,一次用于where谓词。 生成的SQL看起来像这样: SELECT myentity.id, myentity.attribute, relatedentity2.id, relatedentity2.attribute FROM my_entity myentity INNER JOIN […]

将参数设置为IN表达式的列表

每当我尝试将列表设置为在IN表达式中使用的参数时,我都会得到一个Illegal参数exception。 互联网上的各种post似乎表明这是可能的,但它肯定不适合我。 我正在使用Glassfish V2.1和Toplink。 有没有其他人能够让这个工作,如果是这样的话怎么样? 这是一些示例代码: List logins = em.createQuery(“SELECT a.accountManager.loginName ” + “FROM Account a ” + “WHERE a.id IN (:ids)”) .setParameter(“ids”,Arrays.asList(new Long(1000100), new Long(1000110))) .getResultList(); 以及堆栈跟踪的相关部分: java.lang.IllegalArgumentException:您试图为参数accountIds设置类型类java.util.Arrays $ ArrayList的值,具有类java.lang.Long的预期类型来自查询字符串SELECT a.accountManager.loginName FROM Account a WHERE a .id IN(:accountIds)。 at oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.setParameterInternal(EJBQueryImpl.java:663) at oracle.toplink.essentials.internal.ejb.cmp3.EJBQueryImpl.setParameter(EJBQueryImpl.java:202) 在com.corenap.newtDAO.ContactDaoBean.getNotificationAddresses(ContactDaoBean.java:437) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在java.lang.reflect.Method.invoke(Method.java:597) 在com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1011) 在com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:175) at […]

spring数据jpa和hibernate分离的实体传递给ManyToMany关系持久化

我试图坚持一个与已经存在的其他对象有很多关系的对象。 这是我的持久化对象(它们已经存在于db中,这是一个mysql):产品 @Entity @Table(name=”PRODUCT”) public class Product { private int productId; private String productName; private Set reservations = new HashSet(0); @Id @GeneratedValue(strategy=GenerationType.AUTO) public int getProductId() { return productId; } public void setProductId(int productId) { this.productId = productId; } @Column(nullable = false) public String getProduct() { return product; } public void setProduct(String product) { this.product = […]

如何在Hibernate中使用TomEE

我用持久化上下文(hibernate作为提供者)创建了非常简单的app来从数据库中读取一些值。 我将Eclipse与Maven一起使用。 首先,我明白了 Caused by: org.apache.openejb.OpenEJBException: java.lang.ClassCastException: org.hibernate.ejb.HibernatePersistence cannot be cast to javax.persistence.spi.PersistenceProvider: 并根据这个主题http://openejb.979440.n4.nabble.com/problem-with-hibernate-persistence-provider-td980429.html我排除了hibernate-jpa-2.0-api。 现在,我的依赖项看起来 postgresql postgresql 9.1-901.jdbc4 org.hibernate hibernate-entitymanager 4.1.3.Final org.hibernate.javax.persistence hibernate-jpa-2.0-api 现在,我不知道为什么…… Caused by: java.lang.ClassNotFoundException: org.hibernate.transaction.TransactionManagerLookup 但是TransactionManagerLookup处于hibernate核心。 请问,任何人都可以告诉我,在TomEE中如何看待pom.xml使用hibernate?

Hibernate,spring,JPS和隔离 – 不支持自定义隔离

我一直在尝试这个: @Transactional(isolation=Isolation.SERIALIZABLE, rollbackFor={Exception.class}, propagation=Propagation.REQUIRES_NEW) 关于我的服务方法,但spring抱怨说: Standard JPA does not support custom isolation levels – use a special JpaDialect 我该如何解决这个问题?