Ajuda com mapeamento JPA

Olá, estou começando a desenvolver um sistema para verificar o status de um ordem de serviço, basicamente entra um item para realizar o serviço e ele passa por 5 etapas, onde cada etapa correpsonde a uma pessoa responsável, tem um valor pelo serviço, data de entrada e saida e esse tipo de controle.

bom eu criei uma classe para ordem de serviço que recebe a etapa1, essa etapa1 tem uma variável que recebe a etapa 2 q tem uma variável q recebe a etapa 3 e assim vai em frente.
A ideia é chamar a função getvalue() da ordem e ela retornar um hash com key dizendo o nome da etapa e o value o valor.
chamar a função getDateIn() e retornar um hash com key o nome da etapa e o value a data de entrada.

Não sei se é a melhor forma de fazer isso, na verdade fui baseado no padrão decorator, mas o meu problema é que não sou experiente em JPA e não sei como faço o mapeamento dessa classe.
Gostaria de uma luz de como mapear essa classe.

package entities;

@Entity
@Table(name = "steps")
@SequenceGenerator(name = "STEP_SEQUENCE", sequenceName = "steps_id_seq", allocationSize = 1, initialValue = 1)
public class Step {

	public Step(Step nextStep) {
		this.nextStep = nextStep;
	}

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "STEP_SEQUENCE")
	private Long id;
	
	private String StepName;
	
	private String status;
	
	private Functionary functionary;
	
	private double value;
	
	private Step nextStep;
	
	private Calendar dateIn;
	
	private Calendar dateOut;
	
	private List<Part> parts;

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public HashMap<String, Functionary> getFunctionary(
			HashMap<String, Functionary> functionaryList) {
		functionaryList.put(this.StepName, this.functionary);
		return this.nextStep.getFunctionary(functionaryList);
	}

	public void setFunctionary(Functionary functionary) {
		this.functionary = functionary;
	}

	public HashMap<String, Double> getValue(HashMap<String, Double> valueList) {
		valueList.put(this.StepName, this.value);
		return this.nextStep.getValue(valueList);
	}

	public void setValue(double value) {
		this.value = value;
	}

	public Step getNextStep() {
		return nextStep;
	}

	public void setNextStep(Step nextStep) {
		this.nextStep = nextStep;
	}

	public HashMap<String, Calendar> getDateIn(
			HashMap<String, Calendar> dateInList) {
		dateInList.put(this.StepName, this.dateIn);
		return this.nextStep.getDateIn(dateInList);
	}

	public void setDateIn(Calendar dateIn) {
		this.dateIn = dateIn;
	}

	public HashMap<String, Calendar> getDateOut(
			HashMap<String, Calendar> dateOutList) {
		dateOutList.put(this.StepName, this.dateOut);
		return this.nextStep.getDateOut(dateOutList);
	}

	public void setDateOut(Calendar dateOut) {
		this.dateOut = dateOut;
	}

	public HashMap<String, List<Part>> getParts(
			HashMap<String, List<Part>> partsList) {
		partsList.put(this.StepName, this.parts);
		return this.nextStep.getParts(partsList);
	}

	public void setParts(List<Part> parts) {
		this.parts = parts;
	}

	public Long getId() {
		return id;
	}

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

}