标签: openjpa

使用enum作为id

使用JPA,我们可以将枚举定义为实体的id吗?

我尝试过以下方法:

public enum AssetType {
   ....
}

@Entity
@IdClass(AssetType.class)
public class Adkeys {

   private AssetType type;

   @Id
   @Enumerated(EnumType.STRING)
   @Column(nullable = false)
   public AssetType getType() {
      return type;
   }

}
Run Code Online (Sandbox Code Playgroud)

使用OpenJPA,它抱怨:

org.apache.openjpa.persistence.ArgumentException:该ID级别"类aa.AssetType"按类型"类aa.Adkeys"规定不具有公共的无参数的构造.

所以我的问题是:

  • 我们是否应该使用枚举作为JPA上实体的id?(即OpenJPA中存在错误)
  • 或者我在某个地方犯了错误?
  • 这个问题是否有解决方法?

java jpa openjpa

6
推荐指数
2
解决办法
6647
查看次数

在运行配置VM参数中访问eclipse类路径变量M2_REPO的值

在eclipse的运行配置中,为您提供了一组默认变量,您可以在VM参数中使用它们,例如container_pathenv_var.
我想要访问的是一个类路径变量M2_REPO,但是看不到这样做的方法.我需要在VM参数中指定一个javaagent,它需要一个jar文件的路径.这个jar文件存在于maven存储库中,但我找不到使用已配置的M2_REPOClasspath变量(在windows- > preferences- > java- > Build Path- >中配置)指定maven存储库的路径的方法Classpath variable.
我想要做的是使用它作为我的VM参数,但不能因为classpath_var它不是一个真正的变量.

-javaagent:${classpath_var:M2_REPO}/org/apache/openjpa/openjpa/2.1.0/openjpa-2.1.0.jar
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以访问M2_REPOVM参数的值?

eclipse classpath openjpa maven-3

6
推荐指数
1
解决办法
2056
查看次数

如何在JPQL语句中使用typcasting?

Integer在数据库中有两列(derby和db2).我需要在里面把它们分开JPQL.

Integer如果余数是十进制数,则两个类型都返回零,例如0.25变为0等等,因为类型是int,因此可以理解.

SQL我能有这个例如

select CAST(column1 as decimal(6,2))/CAST(column2 as decimal(6,2))from Sometable;

JPQL等同的是什么.

一个选项可能是(我还没有尝试过)是@Transient在实体中有一个方法返回Decimal类型并在那里进行计算并将其传递给JPQL但是我宁愿让SQL这个工作.


Mysql不需要在数据库级别进行转换.所以不同RDBMS的行为是不同的,这很好.但是,JPQL应该如何处理需要使用本机查询才能知道此操作需要使用强制转换为十进制.

添加方言<property name="openjpa.jdbc.DBDictionary" value="derby"/>也没有解决它.

请注意它是JPA1

java jpa openjpa websphere-7

6
推荐指数
2
解决办法
2万
查看次数

性能OpenJPA查询(3000+记录)很慢

我正在使用带有buildin OpenJPA 1.2.3和Oracle数据库的Websphere Application Server 7.我有以下实体:

    @NamedNativeQuery(name=Contract.GIVE_ALL_CONTRACTS, 
        query="SELECT number, name \n" +
          "FROM contracts \n" +
          "WHERE startdate <= ?1 \n" +
          "AND enddate > ?1",
          resultSetMapping = Contract.GIVE_ALL_CONTRACTS_MAPPING)
    @SqlResultSetMapping(name = Contract.GIVE_ALL_CONTRACTS_MAPPING, 
        entities = { @EntityResult(entityClass = Contract.class, fields = {
          @FieldResult(name = "number", column = "number"),
          @FieldResult(name = "name", column = "name")
        })
    })
    @Entity
    public class Contract {
      public static final String GIVE_ALL_CONTRACTS = "Contract.giveAllContracts";
      public static final String GIVE_ALL_CONTRACTS_MAPPING = "Contract.giveAllContractsMapping";

      @Id
      private Integer number;
      private String …
Run Code Online (Sandbox Code Playgroud)

java websphere openjpa

6
推荐指数
1
解决办法
2327
查看次数

实体不通过Spring(CrudRepository)在TomEE上持久化

我尝试使用Springs CrudRepository接口将实体持久化到PostgreSQL数据库时遇到问题.我在TomEE上调整正确的值并调整Spring本身的配置时遇到了一些问题.我曾尝试使用hibernate,但问题变得更糟,所以我切换回与TomEE捆绑在一起的OpenJpa.

我有一些普通JavaEE的经验,我正在创建这个应用程序来学习Spring,我的一个朋友需要一个Spring应用程序来在基于TomEE的ApplicationServer上进行部署,因此这两个是需求.我可能会对我附加的代码量有点过分,但我宁愿让你看看有什么,所以你得到了一个很好的概述.

我开发的组件以及我正在做什么,期待和实际看到的简要描述.组件:

  • CoworkerController(RESTful Spring Controller)
  • CoworkerService(Spring Service与Controller和Repository交互)
  • CoworkerRepository(扩展Spring CrudRepository)
  • 同事(应该坚持的实体)

我的行动流程:

  • 通过curl发送带有firstname lastname的POST到RESTful服务
  • 获取具有持久实体ID的状态200
  • 如果我可以查询我创建的Coworker,请检查PostgreSQL和RESTful服务

我期待的是:

  • 控制器接受POST并调用服务来保持同事
  • 服务告诉Repository保存Coworker
  • 存储库通过Spring魔术持续存储Coworker实体
  • Spring/OpenJPA魔术连接到DataSource,创建ID并在成功时返回Entity
  • 在此期间查看SQL查询
  • 存储库接收持久化实体并返回服务
  • 服务将实体返回给Controller
  • Controller将Entity.id返回给REST服务的调用者

我看到的和我看不到的但希望看到的:

  • 控制器按预期工作
  • 服务日志更正用户信息
  • @PrePersist创建一个Date对象(Logger)
  • 有关openjpa序列查询的SQL语句日志
  • MISSING:没有关于持久化我的实体的SQL INSERT语句
  • 存储库将新的Coworker返回给服务
  • 服务使用creationDate和id记录应该是持久化的实体(例如1)
  • Controller将id返回给REST的调用者(例如1)
  • REST和SQL查询都没有显示数据库中的任何同事:(

在通过google,SO和许多教程尝试所有不同类型的故障排除后,我的配置文件变得非常混乱.现在花了几天时间试图找出问题所在,我现在来到这里,希望你能指出我的错误.

Coworker.java

@Entity
public class Coworker implements Serializable {

    @Transient
    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long coworkerId;
    private String firstName;
    private String lastName;
    @Temporal(TemporalType.DATE)
    private Date creationDate;
    @Temporal(TemporalType.DATE)
    private Date lastUpdatedDate;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "coworker", fetch = …
Run Code Online (Sandbox Code Playgroud)

java spring persistence tomcat openjpa

6
推荐指数
1
解决办法
5598
查看次数

在persistence.xml中外部化动态属性

我们在persistence.xml文件中使用了波纹管属性.

<properties>
    <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver" />
    <property name="javax.persistence.jdbc.dialect" value="org.hibernate.dialect.OracleDialect" />
    <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@XYZDB01:78111:TATAD1" />
    <property name="javax.persistence.jdbc.user" value="admin" />
    <property name="javax.persistence.jdbc.password" value="admin@123" />
    <property name="javax.persistence.jdbc.Schema" value="CSMVC" />
</properties>
Run Code Online (Sandbox Code Playgroud)

但我希望将persistence.xml中的动态属性外部化为类似于bellow的东西.

<properties>
    <property name="javax.persistence.jdbc.driver" value="${db.driver}" />
    <property name="javax.persistence.jdbc.dialect" value="${db.dialect}" />
    <property name="javax.persistence.jdbc.url" value="${db.url}" />
    <property name="javax.persistence.jdbc.user" value="${db.user}" />
    <property name="javax.persistence.jdbc.password" value="${db.password}" />
    <property name="javax.persistence.jdbc.Schema" value="${db.schema}" />
</properties>
Run Code Online (Sandbox Code Playgroud)

注意:我们使用openJpa作为JPA提供程序.

java jpa openjpa java-ee

6
推荐指数
1
解决办法
2638
查看次数

如何使用JPA获取整个实体图

我使用JPA 2.0和OpenJPA作为底层实现.我有一个映射到自身的实体来表示实体之间的父子层次结构.一个实体最多可以有一个以上的子女,但只有一个父母.因此,没有父级的实体位于层次结构的顶层.我的目标是从数据表中获取所有层次结构.所以我的查询为:

SELECT e FROM MyEntity e where e.parent is null
Run Code Online (Sandbox Code Playgroud)

在MyEntity中,我完成了映射:

@ManyToOne
@JoinColumn(name="PARENT")
private MyEntity parent;

@OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
private List<MyEntity> children;
Run Code Online (Sandbox Code Playgroud)

当程序运行时,层次结构顶部的实体将填充其所有子项,但子实体不会获取其子项.我认为EAGER提取将填充整个实体图.但事实并非如此.在JPA 2.1中有EntityGraph ASAIK的功能.但是如何在JPA 2.0中实现呢?

java orm jpa openjpa entitygraph

6
推荐指数
1
解决办法
2333
查看次数

OpenJPA是否适用于Glassfish?

是否有人成功使用OpenJPA与Glassfish?

我正在尝试将OpenJPA 2.1与Glassfish 3.1 Open Source一起使用.我按照说明将这两个集成在这里 - > http://weblogs.java.net/blog/ss141213/archive/2006/07/using_openjpa_a.html

我在Eclipse Indigo中有一个非常简单的EJB项目,具有以下内容:

  • com.rares.test.Person - @Entity
  • com.rares.test.PersonManager - 界面
  • com.rares.test.PersonDao - @Stateless

但是,当我尝试部署时,我的Person @Entity上会出现ClassNotFoundException.投诉似乎是在我的PersonDao中实现的创建方法的Person parm(参见下面的所有代码).

我已经尝试了相同的项目而没有在persistence.xml中指定提供程序,并且该项目工作正常(能够将Person @Entity持久保存到MySql中的PERSON表).如果我没有指定提供者,我想我正在使用EclipseLink(如果我错了,请纠正我).这让我相信我没有正确配置OpenJPA和Glassfish.

堆栈跟踪

Caused by: java.lang.IllegalArgumentException: java.lang.ClassNotFoundException: com.rares.test.Person
    at serp.util.Strings.toClass(Strings.java:164)
    at serp.util.Strings.toClass(Strings.java:108)
    at serp.bytecode.BCClass.getType(BCClass.java:566)
    at org.apache.openjpa.enhance.PCEnhancer.<init>(PCEnhancer.java:283)
    at org.apache.openjpa.enhance.PCEnhancer.<init>(PCEnhancer.java:254)
    at org.apache.openjpa.enhance.PCClassFileTransformer.transform0(PCClassFileTransformer.java:144)
    at org.apache.openjpa.enhance.PCClassFileTransformer.transform(PCClassFileTransformer.java:124)
    at org.apache.openjpa.persistence.PersistenceProviderImpl$ClassTransformerImpl.transform(PersistenceProviderImpl.java:294)
    at org.glassfish.persistence.jpa.ServerProviderContainerContractInfo$1.transform(ServerProviderContainerContractInfo.java:98)
    at com.sun.enterprise.loader.ASURLClassLoader.findClass(ASURLClassLoader.java:742)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
    at java.lang.Class.privateGetPublicMethods(Class.java:2547)
    at java.lang.Class.getMethods(Class.java:1410)
    at com.sun.enterprise.deployment.EjbDescriptor.addAllInterfaceMethodsIn(EjbDescriptor.java:2327)
    at com.sun.enterprise.deployment.EjbDescriptor.getLocalRemoteBusinessMethodDescriptors(EjbDescriptor.java:2290)
    ... 40 more
Run Code Online (Sandbox Code Playgroud)

com.rares.test.Person

@Entity
@Table (name="PERSON")
public class Person implements Serializable …
Run Code Online (Sandbox Code Playgroud)

ejb jpa glassfish openjpa

5
推荐指数
1
解决办法
2084
查看次数

JPA SequenceGenerator 和 GeneratedValue:名称/生成器属性仅每个类唯一?

我使用 JPA + OpenJPA 和 PostgreSQL 作为后端 RDBMS。我的表的主键通常由SERIAL/BIGSERIAL列组成。因此 PostgreSQL 会自动为新条目 ( strategy=GenerationType.IDENTITY)生成 ID 。

ID 属性的注释如下所示:

@Id
@SequenceGenerator(name="myseq",sequenceName="foobartable_fooid_seq")
@GeneratedValue(generator="myseq",strategy=GenerationType.IDENTITY)
Run Code Online (Sandbox Code Playgroud)

我的问题是:我可以将此注释块复制并粘贴到多个实体,同时只修改sequenceName值吗?该sequenceName是从桌到桌不同。但是所有实体的 SequenceGenerator 都可以命名myseq吗?还是必须为每个实体的 SequenceGenerator 指定一个唯一的生成器名称?那么每个 SequenceGenerator 名称在持久化单元中必须是唯一的吗?

使用与数据库中的 sequenceName 相同的值可能是个好主意吗?所以我会写一些类似的东西

@Id
@SequenceGenerator(name="foobartable_fooid_seq",sequenceName="foobartable_fooid_seq")
@GeneratedValue(generator="foobartable_fooid_seq",strategy=GenerationType.IDENTITY)
Run Code Online (Sandbox Code Playgroud)

关于如何命名 SequenceGenerator 的任何建议?

非常感谢您的任何建议!

你的 Snrub 先生

postgresql jpa sequence auto-increment openjpa

5
推荐指数
1
解决办法
5832
查看次数

Hibernate @ColumnTransformer 的 Open JPA 等效项

我正在将 ORM 框架从 Hibernate 切换到 OpenJPA。

在 Hibernate 中,我们可以使用 @ColumnTransformer 注释字段,如下所示。

@Column(name = "EMP_NAME", length = 4000)
@ColumnTransformer(
        read = "pgp_pub_decrypt(emp_name::bytea,dearmor('"+key1+"'))",
        write = "pgp_pub_encrypt(?, dearmor('"+key2+"'))"
)
private String empName;
Run Code Online (Sandbox Code Playgroud)

如何在 OpenJPA 中执行相同操作

java postgresql hibernate jpa openjpa

5
推荐指数
1
解决办法
5255
查看次数