使用Hibernate插入带有主键/外键的行

时间:2014-03-18 00:09:30

标签: java hibernate

在我的Spring项目中,我正在尝试使用Hibernate在数据库中插入一些行,但我遇到了两个问题:

1)在其中一个表中,由该类表示:

@Entity
@Table(name="sessao")
public class Sessao implements java.io.Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @Column
    private int id;

    @Column
    private Usuario usuario;

    @Column
    private int action;

    public Sessao() {
    }

    public Sessao(Usuario usuario, int action) {
        this.usuario = usuario;
        this.action = action;
    }

    public Sessao(int id, Usuario usuario, int action) {
        this.id = id;
        this.usuario = usuario;
        this.action = action;
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Usuario getUsuario() {
        return this.usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public int getAction() {
        return this.action;
    }

    public void setAction(int action) {
        this.action = action;
    }
}

Usuario 是数据库中同名表的外键。当我尝试在数据库中插入一个项目时,这样:

Usuario novo = new Usuario(username, convertByteToHex(digest));
List<Usuario> lista = (List<Usuario>) usuario.findByExample(novo);
novo.setId(lista.get(0).getId());
        novo.setPnome(lista.get(0).getPnome());
        novo.setUnome(lista.get(0).getUnome());
        this.setId_usuario(novo.getId());

        if(lista.size() == 0) {
            ModelAndView mav = new ModelAndView();
            mav.setViewName("usuario_login");
            return mav;
        }
        else {
            Sessao nova = new Sessao(novo, 0);
            sessao.persist(nova);
            ModelAndView mav = new ModelAndView();
            mav.setViewName("usuario_start");
            mav.addObject("usuario", novo);
            return mav;
        }

我收到错误消息:

ERROR: null value in column "fk_usuario" violates not-null constraint

有人知道如何解决这个问题吗?

2)另一种情况与主键有关,数据库中的主键由 serial 类型表示,因此当我执行插入时,我不需要通知此字段,并且可以这样做:

INSERT INTO sessao(fk_usuario, action, usuario) VALUES (?, ?, ?);

我的另一个问题是:我的所有Model类都有construtors,我不需要传递Id作为参数。如果我用这个construtor创建了一个Object,我如何为DAO类传递这个对象以将其保存在数据库中。

用于在我的DAO类中保存数据库的方法是:

@Transactional
public void persist(Sessao transientInstance) {
    log.debug("persisting Sessao instance");
    try {
        sessionFactory.getCurrentSession().persist(transientInstance);
        log.debug("persist successful");
    } catch (RuntimeException re) {
        log.error("persist failed", re);
        throw re;
    }
}

1 个答案:

答案 0 :(得分:1)

代码应映射Usario实体与Sessao实体之间的关联。

public class Sessao{
    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="FORIEGN_KEY_HERE")
    private Usuario usuario;
}

我假设这种关系是One to One我建议观看video tutorial我创建的关于映射@OneToOne关联的关系。

要解决主键问题,请使用@GeneratedValue注释并指定策略:

@Id
@Column
@GeneratedValue(strategy=GenerationType.AUTO) //May need to adjust this to a different strategy
private int id;