I have the following two Address
, User
classes:
import javax.persistence.Embeddable;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
@Embeddable
public class Address {
@NotNull
@Size(max = 50)
private String street;
}
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
@Entity
@Table(name = "USERS")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
private String username;
@Valid
private Address homeAddress;
}
And this is generating the following MySQL table:
CREATE TABLE `USERS` (
`id` bigint NOT NULL AUTO_INCREMENT,
`street` varchar(50) DEFAULT NULL,
`username` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
As you can see, the @NotNull
constraint worked for the username
field, and the @Size(max = 50)
constraint worked for the embedded class. However, the @NotNull
constraint on the embedded class doesn't seem to working, what am I missing?
The pom.xml
, in case it's relevant:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.manning.javapersistence</groupId>
<artifactId>mapping-value-types</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>mapping-value-types</name>
<url>http://maven.apache.org</url>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<includes>
<include>**/*.java</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.6.9.Final</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.20</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.3.Final</version>
</dependency>
</dependencies>
</project>
CodePudding user response:
The reason Hibernate overrides your setting of @NotNull
on Address.street
when generating the table for the User
entity is that the field User.homeAddress
itself is nullable. This means that you have specified that it is perfectly fine to pass a User
object with null
homeAddress
to Hibernate. And Hibernate (JPA generally I think) will deal with it by making all the fields of the embeddable nullable.
Maybe you can try annotating the User.address
field as @NotNull
-or- orverride the embedded column definition with @Embedded @AttributeOverrides({@AttributeOverride(name="street", column=@Column(..., nullable=false))})
.