私はusuariへの参照とrolへの参照を持つusuariRolを保存しようとしています。 私は、UsuariオブジェクトとRolオブジェクトがidsを持っていることを確認しますが、休止状態ではidRolをnullにすることはできません。Hibernateはカラム 'idRol'をnullにすることはできません
マッピングに問題はありますか?
表t_usuariRol
@Entity
@Table(name = "t_usuariRol"
, uniqueConstraints = @UniqueConstraint(columnNames = {"idUsuari", "idRol"}))
public class UsuariRol implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToOne
@JoinColumn(name = "idUsuari")
private Usuari usuari;
@ManyToOne
@JoinColumn(name = "idRol")
private Rol rol;
表
@Entity
@Table(name = "a_rol")
public class Rol implements Serializable {
private static final long serialVersionUID = -1979744578967968079L;
static final String PREFIX = "pia.entity.Rol.";
public static final String findAll = PREFIX + "findAll";
public static final String findById = PREFIX + "findById";
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(length = 45)
private String nom;
a_rol UsuariBean.saveUsuariRol
public void saveUsuariRol(){
UsuariRol urol;
Usuari usuari = usuariMgr.findById(1);
Rol rol = rolMgr.findById(2); //rol is not null has id and nom
urol = new UsuariRol(usuari, rol);
try {
usuariRolMgr.save(urol);
} catch (Exception e) {
System.out.println("error usuarirol with id");
}
}
エラー
Hibernate:
/* insert UsuariRol/
insert
into
t_usuariRol
(idRol, idUsuari, version)
values
(?, ?, ?)
10:25:39,184 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-52) SQL Error: 1048, SQLState: 23000
10:25:39,186 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-52) Column 'idRol' cannot be null
...
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
...
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'idRol' cannot be null
RolManager
@Stateless
public class RolManager {
protected Logger logger = Logger.getLogger(getClass().getName());
@PersistenceContext(unitName = "dbPU")
protected EntityManager em;
public Rol findById(int id) {
return this.em.find(Rol.class, id);
}
public List<Rol> all() {
return this.em.createNamedQuery(Rol.findAll, Rol.class).
getResultList();
}
public Rol save(Rol rol) {
if (rol.getId() == null) {
this.em.persist(rol);
return rol;
} else {
return this.em.merge(rol);
}
}
public void delete(int id) {
try {
Rol reference = this.em.getReference(Rol.class, id);
this.em.remove(reference);
} catch (EntityNotFoundException e) {
//we want to remove it
logger.error("Entity not found exeption: ", e);
}
}
}
どのように 'rolMgr.findById(2);'があなたにこのオブジェクトを返すのですか?それはハイバネートDAOまたは他のクラス変数を介して返されますか? –
RolManagerというクラスを追加しました。そこにはあなたが尋ねたことが分かります。 saveメソッドはUsuariRolManagerで似ています。マネージャーからのすべてのメソッドが注入されます。 – Joe
エンティティにentityManagerからデタッチされたオブジェクトがないことがありますか?私はfindByIdの中で開いて閉じているentityManagerとメソッドを保存するだけです。 – Joe