在我的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;
}
}
答案 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;