Hibernate сохраняются, но не добавляют FK у детей - PullRequest
0 голосов
/ 21 марта 2012

Я стараюсь, чтобы Пользователь мог быть членом нескольких ассоциаций. Для этого я создал:

Пользователи

@Id
@SequenceGenerator(name="seqUsuario",sequenceName="SQ_USUARIO")
@GeneratedValue(generator="seqUsuario",strategy=GenerationType.SEQUENCE)
private Integer idUsuario;

@Column(name="NOMBRE",nullable=false)
private String nombre;

@Column(name="EMAIL",nullable=false)
private String email;

@Column(name="CLAVE",nullable=false)
private String clave;


@Column(name="APELLIDOS",nullable=false)
private String apellidos;


@OneToOne(fetch=FetchType.EAGER)
@JoinColumn(name="IDCALLE")
private Calle calle;

@OneToMany(mappedBy="usuario",cascade=CascadeType.ALL,orphanRemoval=true)
private List<QSM> qsms;

@OneToMany(mappedBy="usuario",cascade=CascadeType.ALL,orphanRemoval=true)
private Set<Miembro> miembros;

Ассоциация

    @Id
@SequenceGenerator(sequenceName="SQ_ASOCIACION",name="seqAsociacion")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seqAsociacion")
private Integer idAsociacion;

@Column(name="NOMBRE",nullable=false)
private String nombre;

@OneToMany(mappedBy="asociacion",cascade=CascadeType.ALL,orphanRemoval=true)
private Set<Miembro> miembros;

Участник

@Id
@SequenceGenerator(sequenceName="SQ_MIEMBRO",name="seqMiembro")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seqMiembro")
private Integer idMiembro;

@ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinColumn(name="IDASOCIACION")
private Asociacion asociacion;

@ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinColumn(name="IDUSUARIO")
private Usuario usuario;

SQL: Член

+----------------+---------+------+
| Field          | Type    | Null |
+----------------+---------+------+
| IDMIEMBRO      | int(11) | NO   |
| IDUSUARIO      | int(11) | YES  |
| IDASOCIACION   | int(11) | YES  |
+----------------+---------+------+

Метод

public void nuevoUsuario(){


    //Creamos el miembro para introducirlo en la A.A.V.V

    Miembro miembro=new Miembro();
    miembro.setActivado(true);

    //Obtenemos el resourcebundle para los mensajes predefinidos

    ResourceBundle recurso=ResourceBundle.getBundle("org.pfc.mensajes.message");

    //Si la asociación vecinal no existe, se crea y el usuario pasa a presidente
    Asociacion asociacion=new Asociacion();
    if(usuario.getCalle().getBarrio().getAsociacion()==null){


        asociacion.setActivado(true);
        asociacion.setPrivado(false);
        asociacion.setNombre("A.A.V.V." + usuario.getCalle().getBarrio().getNombre());
        asociacion.setFecha(Calendar.getInstance());
        asociacion.setDescripcion(MessageFormat.format(recurso.getString("asociacion.descripcion"),usuario.getCalle().getBarrio().getNombre()));

        TipoAsociacion tipoAsociacion=asociacionBo.getTipoAsociacionByString("VECINAL");
        asociacion.setTipoAsociacion(tipoAsociacion);


        miembro.setAsociacion(asociacion);

        asociacionBo.save(asociacion);



    }
    else{

        //Si la asociación existe se añade al usuario como miembro
        usuario.getCalle().getBarrio().getAsociacion().getMiembros().add(miembro);

    }

    usuarioBo.save(usuario);
    miembro.setUsuario(usuario);

    miembroBo.save(miembro);

}

Таким образом, я сохраняю три объекта. Но моя идея не вызывать miembroBo.save (miembro) И, чтобы сохранить весь объект от пользователя.

Проблема, которую я обнаружил в этом коде, заключается в том, что HibernateTemplate.save не возвращает идентификатор (oracle), поскольку он возвращает отношение идентификатора с помощью hibernate. Если я не изменю идентификатор возврата в горячем режиме в отладочном затмении на действительный идентификатор в базе данных , затем выдать исключение FK, почему идентификатор ассоциации или пользователя не имеет ничего общего с реальным идентификатором в базе данных.

РЕШЕНИЕ ДЛЯ "Hibernate не возвращает реальный идентификатор из Oracle с последовательностями и триггерами"

решение здесь

1 Ответ

0 голосов
/ 24 марта 2012

Для сохранения двунаправленного отношения сначала устанавливаются обе стороны отношения, а затем сохраняется объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...