Problemas para actualizar con hibernate

Que tal, amigos:

Antes que nada agradecer por haberme aceptado en su blog, bueno pues mi problema es el siguiente estoy haciendo un pequeño CRUD con Hibernate y Struts 2 ya hice todos los métodos pero me falta el de actulizar, bueno solo es una tabla con 4 campos, idlibro que esta configurada en la base de datos como llave primaria, y autoincrementable, ya hice de todo y nada mas no puedo

este es mi método original:
public boolean delete(Libro libro){
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null;

try {
transaction = session.beginTransaction();
session.update(libro);
transaction.commit();
return true;
} catch (Exception e) {
if(!(transaction==null)){
transaction.rollback();
}
}finally{
session.close();
}
return false;
}
el error capturado dice: que la entidad Libro lleva un campo null que es el id, ya que ese no se puede modificar, después modifique mi método y quedo de la siguiente manera.

public boolean update(Libro libro){
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
Query query = session.createQuery("UPDATE Libro SET idlibro = NULL, nombre = :nombre, precio = :precio, fpublica = :fpublica WHERE idlibro = 'null'");
query.setString("nombre", libro.getNombre());
query.setFloat("precio", libro.getPrecio());
query.setString("fpublica", libro.getFpublica());
int modificar = query.executeUpdate();
//session.update(libro);
transaction.commit();
return true;
} catch (Exception e) {
if(!(transaction==null)){
System.out.println("" + e.getLocalizedMessage() + " : " + e.getMessage() + " : " + e.getCause() + " : " + e.getStackTrace());
System.out.println(e.getMessage());
transaction.rollback();
}
}finally{
session.close();
}
return false;
}

mi entidad quedo de la siguiente manera:

@Entity
@Table(name="libro", catalog="libreria")
public class Libro implements java.io.Serializable {

private Integer idlibro;
private String nombre;
private Float precio;
private String fpublica;

public Libro() {
}

public Libro(String nombre, Float precio, String fpublica) {
this.nombre = nombre;
this.precio = precio;
this.fpublica = fpublica;
}

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "idlibro", unique = true, nullable = false)
public Integer getIdlibro() {
return this.idlibro;
}

public void setIdlibro(Integer idlibro) {
this.idlibro = idlibro;
}

@Column(name="nombre", length=100)
public String getNombre() {
return this.nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

@Column(name="precio", precision=12, scale=0)
public Float getPrecio() {
return this.precio;
}

public void setPrecio(Float precio) {
this.precio = precio;
}

@Column(name="fpublica", length=50)
public String getFpublica() {
return this.fpublica;
}

public void setFpublica(String fpublica) {
this.fpublica = fpublica;
}

}
mi mapeo quedo de la siguiente manera:

ya lo intente con saveorupdate e inserta un nuevo registro ya que como el id va como null, hibernate lo ve como si fuera un nuevo registro, por favor alguien que me ayude, no se si me doy a entender, hibernate no manda la columna ID ya que como se configura desde la base de datos como llave primaria y autoincrementable por eso no lo manda en ningún método(altas,borrado y consulta), pero para actualizar pide que vaya todos los campos, ya agregue el id en el constructor de la entidad y aun asi no manda el id.

cuando corro el programa en modo debug, el objeto de tipo tiene el idlibro como null los demás datos están, hice una prueba poniendo manualmente el ID y asi si hace la modificación por eso se que es el ID el del problema como puedo corregir, que me recomiendan que haga, por favor ayúdenme.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

creo que falto el mapeo

creo que no paso el mapeo pero queda de esta manera:

Imagen de ezamudio

NULL en PK?

Veo tu SQL (o HQL o como se llame) que dice   eso no tiene sentido si   es la llave primaria.

Y no entiendo para qué hacer el query; sería mucho más simple nada más modificar los valores que quieres modificar del libro y luego invocar   y ya...