La pregunta SCBCD del día: Entity Callbacks

(Imagen: Claude Monet - Camile Monet en su lecho de muerte)

Una más:

A developer wants to create a portable EJB 3.0 application that includes de following class definiton for the entity account:

@Entity
@EntityListeners(com.acme.AlertMonitor.class)
public class Account {
//more code here
@PrePersist
protected void validateCreate(){
/*more code here*/
}
}


Which statement is correct?

  • The validateCreate method may NOT throw runtime exceptions
  • The validateCreate method can invoke the EntityManager.flush operation
  • Methods of the class com.acme.AlertMonitor annotated with callback annotations must take an Object or Account instance as only argument
  • The above class definition is NOT correct. An entity cannot define a callback method like PrePersist and use EntityListeners annotation at the same time.
A ver ... vamos por partes. Los métodos callback (como PrePersist) de las entidades pueden lanzar excepciones runtime, por lo quer la primera opción sería incorrecta.

La pregunta establece que el código debe ser portable, por lo que para ese fin se recomienda no invocar a EntityManager, Query, acceder a otras entidades o modificar relaciones en métodos callback de entidades. Segunda opción, descartada también.

Los métodos callback de las entidades definidos directamente en la clase entidad (como validateCreate), o en una superclase tienen la firma void metodo (). Es decir, no reciben parámetros. Sin embargo, si el método callback lo definimos en una clase Listener (como AlertMonitor, según la anotación @EntityListeners), la firma de los métodos es void metodo (Object entidad), donde el objeto "entidad" representa a la entidad sobre la que se realiza la operación. Habemus respuesta!!

La cuarta es incorrecta debido a que es posible usar clases Listeners y definir métodos callback en la misma entidad nis haber conflictos. Primero se ejecutaría el método callback de la clase Listener (para este caso AlertMonitor) y después el método callback de la clase Entidad (validateCreate de la clase Account).

Concluyendo... la respuesta es la tercera.

Pregunta tomada de ExamWorx

1 comments:

Hola,
Tengo dos entidades relaciondas por el ID. Cuando inserto la entidad A, a la entidad B hay que asignarle el id A. Para esto tengo el siguiente metodo en la entidad A:
@prePersist
private void setEntityBId(){
b.setID(this.id);
}
En local me funciona bien, pero cuando lanzo la aplicacion en el servidor "this.id" es null. ¿porque?
El id de A se calcula con una secuencia:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,....)
@SequenceGenerator(....)
@Column(name="A_ID")
private Integer ID;

Gracias y un saludo :)

Reply

Publicar un comentario