Łukasz D.

Łukasz D. Software Developer,
DevOps Fan

Temat: Pytanie o wyjątki rzucane przez JPA podczas walidacji

Witam

Napisałem prostą aplikację w springu 3.0.1 z wykorzystaniem jpa 2.0 i hibernate'a 3.3 i postgresql 8.3. Wszystko działa mniej więcej dobrze, tylko mam wątpliwości co do walidacji. Otóż mam encję:

@Entity
@Table(schema = "public",name = "url_entity")
public class UrlEntity {
...
private String url;
...
@NotNull
@Size(min = 1)
@Column(unique = true)
public String getUrl() {
return url;
}
}


Kiedy próbuję zapisać nową encję do bazy i pole url jest nullem bądź jest puste, dostaję wyjątek javax.validation.ConstraintViolationException, ale gdy nie jest zachowana unikalność pola leci wyjątek javax.persistence.PersistenceException. Czy tak powinno być ?
Czy nie powinien lecieć jednak wyjątek klasy javax.validation.ConstraintViolationException?

Kawałek kodu Dao:

public UrlEntity save(UrlEntity entity) {
entityManager.persist(entity);
entityManager.flush();
return entity;
}
Łukasz Dziedziul edytował(a) ten post dnia 23.04.10 o godzinie 16:48
Sebastian Kolski

Sebastian Kolski programista/DBA

Temat: Pytanie o wyjątki rzucane przez JPA podczas walidacji

Wydaje mi się, że ConstraintViolationException oznacza coś innego niż myślisz. Jest to exception rzucane gdy Validator w czasie sprawdzania ograniczeń (javax.validation.constraints) nałożonych na bean'a wykryje jakąś niezgodność. Nie ma to nic wspólnego z bazami danych. To nie jest java.sql.SQLIntegrityConstraintViolationException z którym chyba go mylisz. JPA ładnie łączy się z JSR-303 Bean Validation, ale Bean Validation nie pokrywa całości annotacji możliwych do użycia przy opisie entity/pól.
ConstraintViolationException masz przy nie spełnieniu @NotNull - javax.validation.constraints.NotNull. Bean jest pewnie validowany przed próbą zapisu do bazy.
Natomiast javax.persistence.PersistenceException jest rzucany w czasie próby zapisu do bazy. Prawdopodobnie w wyniku odpowiedzi z bazy. Możliwe nawet, że w środku ma java.sql.SQLIntegrityConstraintViolationException, ale to chyba zależy od implementacji providera JPA. I lepiej, że flush rzuca ogólny wyjątek że operacja się nie powiodła, który trzeba obsłużyć, niż gdyby to było 15 różnych, do których pisało by się, w większości przypadków, takie same procedury obsługi.

konto usunięte

Temat: Pytanie o wyjątki rzucane przez JPA podczas walidacji

Najlepiej będzie jak nam pokażesz cały wyjątek, gdy validator wykryje błędne pole nie wyrzuca wyjątku a jedynie oznacza pole jako błędne. Możesz też pokazać ten kawałek aplikacji.
Swoją drogą własnie piszę tutorial o tym, postaram się pośpieszyć i go dokończyć dziś, bądź jutro. Może tam znajdziesz odpowiedź.Darek Z. edytował(a) ten post dnia 27.04.10 o godzinie 07:31
Adam Foltyn

Adam Foltyn architekt /
programista - java

Temat: Pytanie o wyjątki rzucane przez JPA podczas walidacji

Łukasz Dziedziul:
Kiedy próbuję zapisać nową encję do bazy i pole url jest nullem bądź jest puste, dostaję wyjątek javax.validation.ConstraintViolationException, ale gdy nie jest zachowana unikalność pola leci wyjątek javax.persistence.PersistenceException. Czy tak powinno być ?
Czy nie powinien lecieć jednak wyjątek klasy javax.validation.ConstraintViolationException?

To co podajesz w @Column służy tylko definicji kolumny w bazie, czyli np wtedy kiedy kontener sam tworzy tabelki a nie do walidacji.
Tak naprawdę to dopóki nie wyślemy obiektu do bazy, ciężko jest stwierdzić czy jakieś pola spełniają kryteria unikalności, trzeba by wysyłać wcześniej jakieś selecty, prawda? Tu dobrze jest się zdać na bazę danych.

konto usunięte

Temat: Pytanie o wyjątki rzucane przez JPA podczas walidacji

Tak troche off-topic: hibernate 3.3 nie jest implementacją JPA 2. Natomiast 3.5 już tak.



Wyślij zaproszenie do