1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Carregar objetos relacionados com @OneToOne

Pessoal, relativamente a duvida na qual eu tenho é basica, mas anda tirando o meu sono.

Tenho uma entidade na qual eu chamo de Destination. Na entidade Destination eu tenho varios relacionamentos do tipo @OneToOne com outras entidades de forma unidirecional como abaixo:

Destination. java (Dona do relacionamneto)

@Entity
@Table(name="destination")
public class Destination implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id_destination")
    private Long idDestination;

    @Column(name="appear_website")
    private Boolean dtAppearWebsite;

    @Lob
    @Column(name="description")
    @NotEmpty(message="O campo \"Descrição do Destino\" não pode estar em branco.")
    private String dtDescription;

    @Column(name="highlight_website")
    private Boolean dtHighlightWebsite;

    @Column(name="name")
    @NotEmpty(message="O campo \"Nome do Destino\" não pode estar em branco.")
    private String dtName;

    @OneToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="fk_streetview")
    private StreetView streetView;

    @OneToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="fk_video")
    private Video video;

    @ManyToOne(cascade=CascadeType.REFRESH)
    @JoinColumn(name="fk_category")
    private Category categories;

    //Profiles of System. These profiles are all enum type.
    @OneToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="fk_economic")
    private EconomicProfile economicProfiles;

    @OneToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="fk_general")
    private GeneralProfile generalProfiles;

    @OneToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="fk_social")
    private SocialProfile socialProfiles;

    @OneToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="fk_trip")
    private TripProfile tripProfiles;

    @OneToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="fk_weather")
    private WeatherProfile weatherprofile;
    //End of Profiles of System.

    @OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.EAGER)
    @JoinColumn(name="fk_destination")
    @Valid
    private Set<Image> images;

        //Getters an setters...

Como pode ser visto acima tenho um "punhado" de relacionamentos tanto como @OneToOne quanto @OneToMany. Sendo que todos estão como cascade tanto para persistência quanto para merge.

Para demonstrar o problema eu rei usar o relacionamento entre Destiantion e WeatherProfile.

@Entity
@Table(name="weather_profile")
public class WeatherProfile implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id_weather")
    private Long id;

    private Boolean heat;
    private Boolean cold;
    private Boolean winter;

    public WeatherProfile(){

    }
    //Getter and Setter...
}

Ok, vamos ao problema!

Na edição eu recupera meu objeto da seguinte forma:

destination.setIdDestination(id);

O mesmo me retorna o objeto populado com todos os relacionamentos. O print abaixo é do objeto destination:

https://www.filepicker.io/api/file/yBYLr12uTPCxyyua57zy

Só que a duvida aparece agora. Quando realizo o merge no objeto as entidades que estão relacionadas são persistidas novamente no banco de dados. Creio que isso seja por causa do id dos objetos que esteja null como mostra a imagem acima.

Porque quando carrego meu objeto principal

destination.setIdDestination(id);

as referencias de outros objetos não estão vindo com o id atrelado?

Obrigado a todos!

  • Manolo, não entendi a forma como você está carregando o objeto do bd. destination.setIdDestination(id); ??

    Jeandeson   29 de set de 2014
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags jpa java-ee banco-de-dados ou faça a sua própria pergunta.