我们很高兴宣布Hibernate ORM 5.5.0.Final新版本的发布!

开始使用Jakarta JPA API

从5.5版本开始,Hibernate发布带有"-jakarta"后缀的artifacts,以实现Jakarta JPA API。

撰写本文时,以下Jakarta artifacts已发布

  • hibernate-core-jakarta

  • hibernate-envers-jakarta

  • hibernate-jpamodelgen-jakarta

  • hibernate-testing-jakarta

由于Jakarta JPA 3.0没有引入任何新功能,所需更改仅为将命名空间从javax.persistence更改为jakarta.persistence

要开始使用,您需要一个至少依赖于org.hibernate:hibernate-core-jakarta的项目,如下所示

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core-jakarta</artifactId>
    <version>5.5.0.Final</version>
</dependency>

Jakarta版本还使用Jakarta XML Binding API,因此您还需要一个Jakarta XML Binding实现

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>3.0.0</version>
</dependency>

如果您正在使用Java 8并且在JAXB相关代码中遇到NullPointerException,请确保您正在使用3.0.1版本的jakarta.xml.bind:jakarta.xml.bind-api,它包含对问题的修复。由于现在每个人都至少使用Java 11+,您可能根本不会遇到此问题 :)

如果您还不想切换到Jakarta JPA API,您当然可以继续使用常规artifacts,如hibernate-core等。撰写本文时,我们尚未决定何时将主要artifacts(如hibernate-core等)更改为使用Jakarta JPA API,但请放心,至少对于Hibernate ORM 6.0,我们将继续使用JPA API。即使我们进行切换,我们也在考虑创建具有-jpa后缀的独立artifacts,以实现JPA 2.2 API,这样您就可以继续使用最新的Hibernate,而无需切换到Jakarta JPA API。

让我们考虑一个表示人的简单实体

import jakarta.persistence.*;
import java.io.Serializable;

@Entity(name = "Person")
@Table(name = "PERSON")
public class Person implements Serializable {

    @Id
    @GeneratedValue
    @Column(name = "ID")
    protected Long id;

    @Column(name = "FIRST_NAME")
    private String firstName;

    @Column(name = "LAST_NAME")
    private String lastName;
    @Column(name = "BODY_WEIGHT")
    private Float bodyWeight;

    // Getters and Setters
}

我们可以使用Jakarta JPA 3.0 API轻松保存和查询该实体,就像使用JPA 2.2 API一样

import org.junit.*;
import jakarta.persistence.*;

public class JPAUnitTestCase {

    private EntityManagerFactory entityManagerFactory;

    @Before
    public void init() {
        entityManagerFactory = Persistence.createEntityManagerFactory( "templatePU" );
    }

    @After
    public void destroy() {
        entityManagerFactory.close();
    }

    @Test
    public void testJakarta() throws Exception {
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        entityManager.getTransaction().begin();

        Person person = new Person();
        person.setFirstName( "John" );
        person.setLastName( "Smith" );
        entityManager.persist( person );

        Person p = entityManager.createQuery( "select p from Person p", Person.class )
                .getSingleResult();
        Assert.assertNotNull( p );

        entityManager.getTransaction().commit();
        entityManager.close();
    }

}

如果您只想查看预构建的示例并进行测试,请查看此示例仓库

请注意,Jakarta artifacts仍被视为实验性的。

这就完成了,享受Jakarta的精彩吧!

错误修复

您可以在这里找到这个版本的完整变更列表(或者,如果您没有Hibernate Jira账户,可以在这里找到)。

感谢

特别感谢Karel Maesen为CockroachDB和PostgisPG10Dialect实现了空间支持。

获取5.5.0.Final版本

所有详细信息都可以在hibernate.org上的专用页面找到,并保持最新。

反馈、问题、想法?

要取得联系,请使用常用渠道


回到顶部