Вставка строк с первичным ключом / внешним ключом с использованием Hibernate

1

В моем проекте 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) Другая ситуация связана с первичным ключом, который в базе данных представлен серийным номером, поэтому, когда я делаю вставку, мне не нужно сообщать это поле и можно сделать так:

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

мой другой вопрос: все мои классы модели имеют конструкторы, в которых мне не нужно передавать параметр Id в качестве параметра. Если я создал объект с этим конструктором, как я мог бы передать этот объект для моего класса DAO, чтобы сохранить его в базе данных.

метод resposable для сохранения данных в базе данных в моем классе 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;
    }
}
Теги:
hibernate

1 ответ

1
Лучший ответ

Код должен отобразить связь между Usario объектом и Sessao лицом.

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

Я предполагаю, что это отношения - One to One Я бы предложил посмотреть видеоуроки, которые я создал о сопоставлении ассоциаций @OneToOne.

Чтобы решить проблему с первичными ключами, используйте аннотацию @GeneratedValue и укажите стратегию:

@Id
@Column
@GeneratedValue(strategy=GenerationType.AUTO) //May need to adjust this to a different strategy
private int id;
  • 0
    с этими изменениями теперь я получаю сообщение об ошибке: @Column (s) не разрешены для свойства @OneToOne: org.ligadesportiva.core.Sessao.usuario . Я предполагаю, что мне следует изменить тип атрибута usuario на int? или, может быть, существует какая-то опция, чтобы заставить Hibertate использовать атрибут Id из класса Usuario? Есть идеи?
  • 0
    Просто удалите @Column из поля Usario .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню