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

时间:2015-01-22 11:09:26

标签: java database jpa annotations

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

database

我尝试使用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
    ...
}

映射似乎是一个很难的挑战,这不是功课,我只是想知道这是不是很好的做法。我的类的布局是否需要与数据库结构相似? 理想情况下,我希望我的对象的逻辑与我的项目规范绑定,我也希望将对象的结构冻结为一个范例,也不会对数据库组织产生影响。

1 个答案:

答案 0 :(得分:1)

首先,在java对象中,你应该坚持使用java命名约定。例如,project_name DB列应映射到projectName字段(使用@Column注释)。其次,从DB图中可以100%清楚这两个表之间的关系是什么,但是从复数名称(histories)来判断,我猜它是@OneToMany。第三,历史实体中的地图(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
    ...
}