GVKun编程网logo

如何使用JPA设置Eclipselink?(eclipse jpa project change)

17

本文将带您了解关于如何使用JPA设置Eclipselink?的新内容,同时我们还将为您解释eclipsejpaprojectchange的相关知识,另外,我们还将为您提供关于eclipse构建jpap

本文将带您了解关于如何使用JPA设置Eclipselink?的新内容,同时我们还将为您解释eclipse jpa project change的相关知识,另外,我们还将为您提供关于eclipse 构建 jpa project 所需的用户库(vendor: EclipseLink)、EclipseLink JPA`@ PreUpdate`调用不持久、EclipseLink JPA继承(不包含鉴别符)列、Hibernate或EclipseLink for JPA?[关闭]的实用信息。

本文目录一览:

如何使用JPA设置Eclipselink?(eclipse jpa project change)

如何使用JPA设置Eclipselink?(eclipse jpa project change)

该EclipseLink的文件说,我需要在我的pom.xml与Maven得到它下面的条目:

<dependencies>  <dependency>    <groupId>org.eclipse.persistence</groupId>    <artifactId>eclipselink</artifactId>    <version>2.0.0</version>    <scope>compile</scope>       ...  </dependency><dependencies>      ...<repositories>  <repository>     <id>EclipseLink Repo</id>     <url>http://www.eclipse.org/downloads/download.php?r=1&amp;nf=1&amp;file=/rt/eclipselink/maven.repo</url>  </repository>          ...</repositories>

但是当我尝试使用@Entity注释时,NetBeans告诉我,找不到该类。确实如此:Eclipselink的javax.persistence包中没有Entity类。

我必须如何使用Maven设置Eclipselink?

答案1

小编典典

eclipselink工件不提供JPA 2.0 API ,您需要添加javax.persistence

<repositories>  <repository>    <id>eclipselink</id>    <url>http://www.eclipse.org/downloads/download.php?r=1&amp;nf=1&amp;file=/rt/eclipselink/maven.repo/</url>  </repository></repositories><dependencies>  <dependency>    <groupId>org.eclipse.persistence</groupId>    <artifactId>eclipselink</artifactId>    <version>2.0.0</version>    <scope>provided</scope><!-- since I''m running inside a Java EE container -->  </dependency>  <dependency>    <groupId>org.eclipse.persistence</groupId>    <artifactId>javax.persistence</artifactId>    <version>2.0.0</version>    <scope>provided</scope><!-- since I''m running inside a Java EE container -->  </dependency>  ...

为了简单起见,我建议使用非OSGI EclipseLink jar。

eclipse 构建 jpa project 所需的用户库(vendor: EclipseLink)

eclipse 构建 jpa project 所需的用户库(vendor: EclipseLink)

Eclipse 构建 JPA Project 时,需要指定 JPA 的实现,如:下图中的 EclipseLink 2.7.3,这其实是一个自定义的用户库。

看看,这个用户库包含 persistence 接口和 eclipselink 提供的实现。

 

上述的用户库包含的 jar 包都在下面的压缩包中:

EclipseLink_2.7.3.rar

 

 

附:

不过,我更喜欢直接用 maven 依赖更简单快捷。

<project ...>
    ...
    <dependencies>
        ...
<!-- jpa-api, persistence interface --> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>javax.persistence</artifactId> <version>2.2.1</version> </dependency> <!-- jpa-impl, eclipselink vendor --> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>2.7.3</version> </dependency> ... </dependencies> </project>

 

EclipseLink JPA`@ PreUpdate`调用不持久

我在StackOverflow上遇到了类似的问题,尝试了解决方案,但没有找到答案。

我正在使用一种相当通用的JPA策略来设置某些实体的上次修改时间。设置列和字段,然后使用标记方法,@PreUpdate并将其设置为等于当前时间。

问题是,我可以在调试器中看到正在调用该方法并且该字段正在更新,但是在我的数据库日志中,我仅看到一个SQL调用,以UPDATE更改字段,其中不包含timestamp字段的UPDATE。

使事情复杂化还@PrePersist可以完美地完成工作,仅@PreUpdate体现这种行为。

到目前为止,我找到的最接近的解释是此LINK。

类似问题在#1725699和#1745890

我正在使用EclipseLink v2和JPA v1来与GlassFish v2兼容。

我尝试直接在Entity类的方法上使用这两个注释,以及使用注释EntityListener附加到Entity类的方法@EntityListener

我怀疑这是EclipseLink中的错误,但我无法证明这一点。

是否出错我非常希望这个简单的操作能够正常工作。这个实现有什么问题吗?这是EclipseLink中的已知问题吗?这是JPA中的已知问题吗?有没有解决的办法?

除了进入数据库和使用触发器之外,还有没有其他路径可以让我的Java代码设置updated_on时间戳?

谢谢你的建议!

代码段如下。

实体字段:

@Column(name = "updated_on")
@Temporal(TemporalType.TIMESTAMP)
private Date updatedOn;
@Column(name = "created_on")
@Temporal(TemporalType.TIMESTAMP)
private Date createdOn;

带注释的更新方法:

@PreUpdate
public void setUpdatedOn(Timestamped object) {
    object.setUpdatedOn(new Date());
}

@PrePersist
public void setCreatedOn(Timestamped object) {
    if (object.getCreatedOn()==null) {
      object.setCreatedOn(new Date());
    }
}

EclipseLink JPA继承(不包含鉴别符)列

我有一个Client和Affiliate类,它是从Person类继承的。正在使用联接的继承策略类型-
它们中的每一个都与父类共享主键。由于没有鉴别符列,我们选择使用DescriptorCustomizer和ClassExtractor。但是它并没有真正让人们知道它是如何工作的,而且代码似乎也没有编译。如果有人给出一个带有代码片段的漂亮示例以供理解,那将是很好的。

答案1

小编典典

根据上述文档:

如果要映射到现有数据库,并且表没有区分符列,您仍然可以使用@ClassExtractor注释或<class-extractor>元素定义继承
。类提取器采用实现ClassExtractor 接口的类。此类的实例用于确定要用于数据库行的类类型。类提取器必须定义一个
extractClassFromRow()采用数据库Record和的方法 Session

我们需要使用类提取器定义的用户注释层次结构中的根实体:

@Entity@Inheritance(strategy = InheritanceType.JOINED)@ClassExtractor(PersonClassExtractor.class)public abstract class Person {    @Id @GeneratedValue(strategy = GenerationType.AUTO)    private int id;    private String name;    private int age;    // ...}

请注意,我们不使用@Customizer注释,因为在JOINED继承策略的情况下这不是必需的:

如果将类提取器与SINGLE_TABLE继承一起使用,则必须能够在查询中过滤类类型的行。这可以通过为分支类设置onlyInstancesExpression()
来实现withAllSubclassesExpression()。可以使用设置这些Expression对象DescriptorCustomizer

类提取器必须能够确定并从数据库行返回类类型。通常,我们需要替换一个鉴别符列,即

  • 列名对于给定的实体类型是唯一的
  • 基于根实体给定列的值的条件

假设层次结构中的每个继承实体类型都有一个具有唯一名称的列:

@Entitypublic class Client extends Person {    @Column(name = "CLIENT_SPECIFIC")    private String clientSpecific;    // ...}@Entitypublic class Affiliate extends Person {    @Column(name = "AFFILIATE_SPECIFIC")    private float affiliateSpecific;    // ...}

那么类提取器可能如下所示:

public class PersonClassExtractor extends ClassExtractor {    @Override    public Class<?> extractClassFromRow(Record databaseRow, Session session) {        if (databaseRow.containsKey("CLIENT_SPECIFIC")) {            return Client.class;        } else if (databaseRow.containsKey("AFFILIATE_SPECIFIC")) {            return Affiliate.class;        } else {            return Person.class; // this should never happen        }    }}

  • 检索客户和会员列表

    List polymorphicResults = em.createQuery(“SELECT p FROM Person p”)
    .getResultList();

  • 分别检索会员或客户列表

    List concreteResults = em.createQuery(“SELECT a FROM Affiliate a”)
    .getResultList();

    List concreteResults = em.createQuery(“SELECT c FROM Client c”)
    .getResultList();

Hibernate或EclipseLink for JPA?[关闭]

我想知道是否有人对这些框架的JPA2.0实现有经验?特别是与带有EclipseLink支持的Spring3.x一起使用。

您是否使用任何这些框架和JPA2.0进行生产?有什么 严重的 问题吗?

答案1

小编典典

恕我直言,总是尽可能使用标准的api。您自己的示例完美地展示了这一点。当一个提供商无法按预期工作时,您可以在两个提供商上尝试使用相同的代码。切换到任何本机API都会阻止您执行此操作。

如果将EclipseLink用作JPA
2.0提供程序对您来说效果很好,请使用它。如果您确实碰巧遇到问题,请提交EclipseLink错误,并在该论坛或EclipseLink论坛和新闻组上获取帮助。

我们今天的关于如何使用JPA设置Eclipselink?eclipse jpa project change的分享就到这里,谢谢您的阅读,如果想了解更多关于eclipse 构建 jpa project 所需的用户库(vendor: EclipseLink)、EclipseLink JPA`@ PreUpdate`调用不持久、EclipseLink JPA继承(不包含鉴别符)列、Hibernate或EclipseLink for JPA?[关闭]的相关信息,可以在本站进行搜索。

本文标签: