Hibernate Tips: How to perform different validations for persist and update



Get access to all my video courses, 2 monthly Q&A calls, monthly coding challenges, a community of like-minded developers, and regular expert sessions.

Join the Persistence Hub!


Hibernate Tips is a series of posts in which I describe a quick and easy solution for common Hibernate questions. If you have a question for a future Hibernate Tip, please post a comment below.

Question:

I’m using BeanValidation to validate my entities automatically before they get persisted and updated. I defined different ValidationGroups for INSERT and UPDATE operations.

Can I tell Hibernate which ValidationGroups it shall use before persisting or updating an entity?

Solution:

Yes, the JPA specification defines a set of configuration parameters to configure which ValidationGroups shall be validated before performing an insert, update, and remove operations.

Let’s take a look at an example.

Defining the Validation

The JPA and BeanValidation specifications integrate very easily. You can annotate your entity attributes with BeanValidation annotations, which specify the validation you want to perform. The validation will then get triggered automatically before each lifecycle state change.

In the following code snippet, I use the @Min and the @Max annotations to ensure that the numPages attribute contains a value between 100 and 1000.

@Entity
public class Book {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;

	private String title;
	
	@Min(value = 100, groups = PublishedBook.class)
	@Max(1000)
	private int numPages;

	...
}

The @Min validation references the PublishedBook interface as a ValidationGroup. This validation is now part of the PublishedBook ValidationGroup and no longer part of the default group.

public interface PublishedBook {}

Configuring Different ValidationGroups for Persist and Update

In the next step, you can set which ValidationGroups shall be validated before an entity gets persisted, updated, or removed. By default, your JPA implementation uses the default group before persisting and updating an entity and doesn’t perform any validation before removing it.

You can change that in your persistence.xml file using the following parameters:

  • javax.persistence.validation.group.pre-persist
  • javax.persistence.validation.group.pre-update
  • javax.persistence.validation.group.pre-remove

In this example, I use the javax.persistence.validation.group.pre-update to tell Hibernate to validate the org.thoughts.on.java.validation.PublishedBook ValidationGroup before an entity gets updated.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
	<persistence-unit name="my-persistence-unit">
		<description>Hibernate Tips</description>
		<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
		<exclude-unlisted-classes>false</exclude-unlisted-classes>

		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />

			<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/recipes" />
			<property name="javax.persistence.jdbc.user" value="postgres" />
			<property name="javax.persistence.jdbc.password" value="postgres" />

			<property name="javax.persistence.validation.group.pre-update" value="org.thoughts.on.java.validation.PublishedBook" />
		</properties>
	</persistence-unit>
</persistence>

I don’t change the default groups for the pre-persist and pre-remove validation. So, before an entity gets persisted, Hibernate will trigger the validation of the default group and will not trigger any validation before the entity gets removed.

Learn more:

To learn more about BeanValidation and its integration with JPA, please take a look at the following articles:

 

Hibernate Tips Book







Get more recipes like this one in my new book Hibernate Tips: More than 70 solutions to common Hibernate problems.

It gives you more than 70 ready-to-use recipes for topics like basic and advanced mappings, logging, Java 8 support, caching, and statically and dynamically defined queries.

Get it now!


Related Articles

Responses

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.