Hola.
Por lo que he podido leer en la documentación de Java EE, hay escasas diferencias, pero sutiles:
@NotNull impide que el valor del objeto sea nulo.
@Basic(optional=false) indica que el valor del campo o la propiedad no puede ser nulo. Se puede usar para generar el esquema de base de datos a partir de la entidad.
@Column(nullable=false) se refiere a que el campo de la tabla de la base de datos no puede ser nulo.
Creo que la diferencia estará en que, si usas la tercera, te permitirá crear objetos con valores nulos en los campos marcados, pero no persistirlos. Con las otras dos, las propiedades marcadas no deberían poder ser nulas en el propio objeto. Creo que la diferencia entre @NotNull y @Basic(optional=false), es que esta segunda te permite marcar los métodos get. Aunque esto te lo digo sólo leyendo la documentación, no lo he probado.
Espero que te sea útil :)