JPA - Własny typ wyliczeniowy

0

W teście otrzymuje imie Psa SENIOR, bo kolumna rasa ma wartosc 1.
Wie ktos może jak zrobić by wpisać własne wartosci. np Junior 100 itp??

Enum:

public enum SlownikZamowienie {
	JUNIOR, 
	SENIOR, 
	PRINCIPAL;	
}

Entity:

package test.jpa.domain;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import test.enums.SlownikZamowienie;

@Entity
@Table(name="Piess")
public class Pies implements Serializable {
	private static final Long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="id")
	int id;
	@Column(name = "imie")
	String imie;
	@Enumerated
	@Column(name = "rasa")
	SlownikZamowienie typzamowienia;
	
	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public String getImie() {
		return imie;
	}
	
	public void setImie(String imie) {
		this.imie = imie;
	}

	public SlownikZamowienie getTypzamowienia() {
		return typzamowienia;
	}

	public void setTypzamowienia(SlownikZamowienie typzamowienia) {
		this.typzamowienia = typzamowienia;
	}
	
}

Test:

package test.jpa;


import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import test.jpa.domain.Pies;

public class Test_Pies {
	
	public static void main(String[] args) {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAService");
		EntityManager em = emf.createEntityManager();
		
		try {
				Pies pies = em.find(Pies.class, 1);
				System.out.print("imie psa" + pies.getTypzamowienia());
		}
		catch(Exception ex) {
			ex.printStackTrace();
		}
	}
}
1

https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

public enum SlownikZamowienie 
{
    JUNIOR(42), 
    SENIOR(666), 
    PRINCIPAL(31416);    
    private final int wartosc;
    SlownikZamowienie(int wartosc) {
        this.wartosc = wartosc;
    }
}
0

Można mieć tylko dwa drobne pytanka :

Jak wpisać poprawnie dane do formularza ?? :
jak wykonuje linijkę : formularz.setTypKlienta(SlownikTypKlienta.KLIENT_BIZNESOWY) zapisuje wartosc 666.
Natomiast gdy próbuję tej metody formularz.setTypKlienta(SlownikTypKlienta.valueOf(request.getParameter("typKlienta").trim())); zapisuje wartosc zero. a chciałbym otrzymać wartosc 666.

I gdy wypiuję dane java.lang.IllegalArgumentException: Unknown ordinal value [666] for enum class [hurtownia.dictionaries.SlownikTypKlienta].

0
kardamon napisał(a):

Jak wpisać poprawnie dane do formularza ?? :

Jeżeli użytkownik wybiera jedną z już znanych wartości, to wyświetl mu listę wyboru (html select). Możesz ją zbudować dynamicznie podczas renderowania strony (jak- to zależy jakiego frameworka web używasz). Wpisywanie z palca to najgorszy pomysł.
I jeszcze druga rzecz- zamiast typu enum zastanów się nad tabelą TYPY, z kolumnami "id" i "nazwa". Możesz tam wpisać te wartości, i zamapować na nią jako klucz obcy kolumnę "typzamowienia". Będzie to jednokierunkowa relacja OneToOne. Nie będziesz miał wtedy danych rozproszonych pomiędzy kodem a bazą, i tego typu problemów o których piszesz.

0

A nie istnieje żeby ze String otrzymać typ wyliczeniowy??

0

Istnieje. enum.valueOf ale przekazany string musi być dokładny ;]

enum Test{
    JEDEN,
    DWA
}
// To zadziała:
Test jeden = Test.valueOf("JEDEN");
// A to już nie:
Test dwa = Test.valueOf("dwa");
0

ok, a wie Pan może czemu java przyjmuję wartosci od 0 a nie ustalone przez zemnie??

0

Bo nie możesz zmienic ordinala.
http://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html#ordinal--
Te wartości które sobie podajesz do enuma to są wartości jego parametrów i takich parametrów możesz mieć więcej niż jeden. Nie mają one nic wspólnego z ordinalem, który określa jedynie kolejność wyliczeń.

0

A ma Pan mozę jakis pomysł( w miarę elegancki i łatwy) aby rozwiążać mój problem??

1 użytkowników online, w tym zalogowanych: 0, gości: 1