It’s done using @Embeddable and @EmbeddedId annotations.
Let’s assume that we are writing an application that manages “WrokspaceTaskHistory” of various clients. Every “WrokspaceTaskHistory” has a unique “WorkspaceTaskHistoryId”.
To identify a WrokspaceTaskHistory uniquely, we need to know its WorkspaceTaskHistoryId . Check out the following workspace_task_history table that contains a composite primary key which includes both the workspace_id and task_id columns –
CREATE TABLE `workspace_task_history` ( `workspace_id` VARCHAR(255) NOT NULL, `task_id` VARCHAR(128) NOT NULL, `status` VARCHAR(10) NULL, `start_time` VARCHAR(255) NULL, `stop_time` VARCHAR(255) NULL, CONSTRAINT `workspaceExistsForTaskHistory` FOREIGN KEY (`workspace_id`) REFERENCES `demo`.`workspace` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION);
The Java code for representing the Embeddable id for the table/entity is like below
@Embeddable public class WorkspaceTaskHistoryId implements Serializable { @Column(name = "workspace_id") private String workspaceId; @Column(name = "task_id") private String taskId; public String getWorkspaceId() { return workspaceId; } public void setWorkspaceId(String workspace_id) { this.workspaceId = workspace_id; } public String getTaskId() { return taskId; } public void setTaskId(String taskId) { this.taskId = taskId; } }
Now the usage of the @EmbeddedId to use @Embeddable class is like below
@Entity @Table(name="workspace_task_history") public class WorkspaceTaskHistory implements Serializable { @EmbeddedId WorkspaceTaskHistoryId workspaceTaskHistoryId; @Column(name = "status") private String status; @Column(name = "start_time") private String startTime; @Column(name = "stop_time") private String stopTime; public WorkspaceTaskHistory() { } public WorkspaceTaskHistoryId getWorkspaceTaskHistoryId() { return workspaceTaskHistoryId; } public void setWorkspaceTaskHistoryId(WorkspaceTaskHistoryId workspaceTaskHistoryId) { this.workspaceTaskHistoryId = workspaceTaskHistoryId; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getStartTime() { return startTime; } public void setStartTime(String startTime) { this.startTime = startTime; } public String getStopTime() { return stopTime; } public void setStopTime(String stopTime) { this.stopTime = stopTime; } }
Spring Data JPA repository for the WorksspaceTaskHistory.java/ workspace_task_history.sql
@Repository public interface WorkspaceTaskHistoryRepository extends CrudRepository<WorkspaceTaskHistory,WorkspaceTaskHistoryId>{ WorkspaceTaskHistory findByWorkspaceTaskHistoryId(WorkspaceTaskHistoryId workspaceTaskHistoryId); }