Différence entre @GeneratedValue et @GenericGenerator

Je trouve parfois ensemble, parfois seul... d'autres fois, ils semblent faire de même.

Quelle est la différence?

Voici trois exemples. Que font-ils de différent? Pourquoi ne puis-je pas utiliser juste @GeneratedValue pour tous?

Exemple 1

@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment") 
Long id;

Exemple 2

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE)
private int userId;

Exemple 3

@ElementCollection
@JoinTable(name="Address",
   joinColumns=@JoinColumn(name="user_id")
)
@GenericGenerator(name="hilo-gen", strategy="hilo")
@CollectionId(columns = @Column(name="Address_id"), generator = "hilo-gen", type = @Type(type="long"))
Collection<Addr> listOfAddresses = new ArrayList<Addr>();
InformationsquelleAutor user1883212 | 2013-08-13