Hold and validate EAN code - follow-up
interface BarCode

The interface is a good idea, but it shouldn't be just a marker interface. It seems very probable that all the implementations that you will add later, will contain a String code value. So, a method declaration like String getCode(); would be useful here. It will allow to access the value when necessary, without worrying about the concrete BarCode type behind.

Over-engineering

But I'm also asking myself if a separate class per BarCode type is really necessary here. Should ean just remain a basic field within Product?

@Entity
public class Product { ...

  @Column
  private String eanCode;
  ...
}


The idea would be to validate the candidate eanCode value before setting it on the object. Not sure that dedicated classes are necessary, because they are just wrappers for the only field, aren't they?

Exceptions Handling

Taking into account the current listing, the code 

try {
  BarCode ean = new Ean13Factory().create(code);
  p.setEan((Ean13) ean);
} catch (InvalidBarCodeException e) {
  logInvalidCode(e, code);
}


does exactly the same thing as if it were

if (BarCodePredicate.isValid(code) {
  p.setEan(new Ean13(code));
} else {
  logInvalidCode(code);
}


This resembles drastically to what we can find in item#59, page 247 of Effective Java.