使用 JPA 持久性将历史对象映射到项目对象

Mapping an History Object to a Project Object with JPA persistence

这是我的程序的最小示例数据库:

我尝试使用 JPA 注释将这些表映射到以下 Java 类(我对那些 Gremlins 很陌生)


Project.java

@Entity
@Table(name = "projects")
public class Project {

    @Id
    String project_name;

    @Column
    String description;

    @ ??
    History history;


    // methods
    ...
}

History.Java

@Entity
@Table(name = "histories")
public class History {

    @Id
    String history_id;

    @ ??
    Map<Date, String> sets; // represents the date/description pairs associated to the project


    // methods
    ...
}

映射似乎有点难,这不是作业,我只是想知道这是否是个好习惯。我的 类' 布局是否需要与数据库结构相似? 理想情况下,我希望我的对象的逻辑与我的项目规范绑定,我也希望将我的对象的结构冻结到一个范例不会对数据库组织产生影响。

首先,在 java 对象中,您应该遵守 java 命名约定。例如,project_name 数据库列应映射到 projectName 字段(使用 @Column 注释)。其次,从 DB 图表中并不能 100% 清楚这两个表之间的关系,但从复数形式的名称 (histories) 来看,我猜它是 @OneToMany。第三,那个 Map in History 实体 (sets) 不能那样做,但是它被 @OneToMany 关系覆盖了。尝试这样的事情

@Entity
@Table(name = "projects")
public class Project {

    @Id
    @Column(name = "project_name")
    private String projectName;

    private String description;

    @OneToMany(mappedBy = "project")
    private List<History> historyList;

    // getters and setters
    ...
}

@Entity
@Table(name = "histories")
public class History {

    @Id
    @Column(name = "history_id")
    private Integer historyId;

    @Temporal(TemporalType.DATE) // or TemporalType.TIMESTAMP
    private Date date;

    private String description;

    @ManyToOne
    @JoinColumn(name = "project_name")
    private Project project;

    // getters and setters
    ...
}