2017-02-27 14 views
1

私は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); 
     } 
    } 
} 
+0

どのように 'rolMgr.findById(2);'があなたにこのオブジェクトを返すのですか?それはハイバネートDAOまたは他のクラス変数を介して返されますか? –

+0

RolManagerというクラスを追加しました。そこにはあなたが尋ねたことが分かります。 saveメソッドはUsuariRolManagerで似ています。マネージャーからのすべてのメソッドが注入されます。 – Joe

+0

エンティティにentityManagerからデタッチされたオブジェクトがないことがありますか?私はfindByIdの中で開いて閉じているentityManagerとメソッドを保存するだけです。 – Joe

答えて

1

私は推測することができような問題は、Hibernateのセッションは、あなたの子オブジェクトを追跡することができないということです。あるセッションからロードされ、別のセッションに保存されたエンティティは問題を引き起こす可能性があります。

この問題を解決するには

    1. スタートセッションとトランザクションは、子オブジェクトに
    2. 保存親オブジェクト
    3. を取得後

    上記のすべてのプロセスのために同じセッションを使用してコミット。

  • +0

    これはうまく動作するソリューションですが、最適なものを探し続けます – Joe

    関連する問題