Java如何在JPA中创建实体对象?

本示例向您展示一个简单的示例,该示例用于将数据库表映射到java对象。该实体是一个普通的旧Java对象(POJO)。JPA规范并不要求该类扩展或实现其他类或接口。

要保留在数据库中的类必须使用javax.persistence.Entity注解(@Entity)进行注解。正如您在Record下面的课程中看到的那样。

默认情况下,映射表名称等于类名称。但是,如果表名不同于类名,则可以使用@Table注解。使用name此批注的属性设置表名称。该注解也位于javax.persistence包中。

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

@Entity
@Table(name = "records")
public class Record implements Serializable {
}

在JPA中,可以在类字段中或使用getters或setters方法添加元数据。选择一个选项,因为您不能将它们都混在同一个实体对象中。在这里,我们将注解该类的获取者。

要定义实体的主键,我们使用@Id注解。该@GeneratedValue注解用于定义如何应生成实体的主键。例如,在此示例中,策略定义为GenerationType.IDENTITY。在MySQL数据库中,将其实现为一auto-increment列。

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
    return id;
}

默认情况下,实体的字段将保留在数据库表中的相应字段中。如果您不想保留实体字段,则必须在其中添加@Transient注解。如果您的实体字段名称与表字段不同,则可以使用@Column注解定义列名称和列的其他属性,例如长度,字段的唯一性和not-null属性。

要定义实体对象之间的关系,你可以使用注解如@OneToOne,@OneToMany,@ManyToOne和@ManyToMany。该注解表示Java对象中数据库表之间的关系。

@Column(nullable = false, length = 50)
public String getTitle() {
    return title;
}

@Column(name = "release_date")
public Date getReleaseDate() {
    return releaseDate;
}

@ManyToOne
@JoinColumn(nullable = false)
public Artist getArtist() {
    return artist;
}

这是Record实体的完整类。这将保存有关音乐记录的信息。该实体与Artist和Label实体等其他实体有关系。

package org.nhooo.example.jpa.entity;

import javax.persistence.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

@Entity
@Table(name = "records")
public class Record implements Serializable {
    private static final long serialVersionUID = 1L;

    private Long id;
    private String title;
    private Date releaseDate;
    private Artist artist;
    private Label label;

    private List<Track> trackList = new ArrayList<>();

    public Record() {
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    @Column(nullable = false, length = 50)
    public String getTitle() {
        return title;
    }

    @Column(name = "release_date")
    public Date getReleaseDate() {
        return releaseDate;
    }

    @ManyToOne
    @JoinColumn(nullable = false)
    public Artist getArtist() {
        return artist;
    }

    @ManyToOne
    @JoinColumn(nullable = false)
    public Label getLabel() {
        return label;
    }

    @OneToMany(mappedBy = "record")
    public List<Track> getTrackList() {
        return trackList;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setReleaseDate(Date releaseDate) {
        this.releaseDate = releaseDate;
    }

    public void setArtist(Artist artist) {
        this.artist = artist;
    }

    public void setLabel(Label label) {
        this.label = label;
    }

    public void setTrackList(List<Track> trackList) {
        this.trackList = trackList;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Record record = (Record) o;
        return Objects.equals(id, record.id) &&
            Objects.equals(title, record.title) &&
            Objects.equals(releaseDate, record.releaseDate);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, title, releaseDate);
    }

    @Override
    public String toString() {
        return "Record{" +
            "id=" + id +
            ", title='" + title + '\'' +
            ", releaseDate=" + releaseDate +
            '}';
    }
}

Maven依赖

<!-- https://search.maven.org/remotecontent?filepath=javax/persistence/javax.persistence-api/2.2/javax.persistence-api-2.2.jar -->
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>javax.persistence-api</artifactId>
    <version>2.2</version>
</dependency>

Maven中央