Got this to work. Stupid error on my part, the @NotNull field was actually being set to an empty String and the error wasn't caught on unit tests.
Sorry for the noise.
For those who care, it's probably good practice to always use @Length (min = 1) for varchar columns, especially if the column has a UNIQUE constraint.
Code:
// required column
@NotNull
@Length (min = 1, max = 100)
@Column (nullable = false, unique = true)
private String serialNumber ;
// non - required column
@Length (min = 1, max = 100)
@Column (nullable = true, unique = true)
private String licenseNumber ;