Hibernate Аннотации один-ко-многим родитель-потомок удаляют - PullRequest
0 голосов
/ 10 октября 2011

Я работаю с однотипными отношениями в спящих аннотациях JPA, вот моя таблица и детали класса сущностей ...

Service   (entity class: ServiceRegistration.java)
=======
serviceid
servicename

channel    meta table (entity class: Channels.java)
========
channelid
channelname

service_channel   (entity class: ServiceChannels.java)
===============
seq_id
serviceid
channelid

Здесь таблица service_channel содержит serviceid и channelid в качестве внешних ключей. Я могу получать, изменять записи.

  1. Но я не смог удалить службу и ее дочерние записи. Если я удалю записи таблицы служб, соответствующие записи таблицы service_channel должны быть удалены. вот мой класс сущности подробнее ...

  2. Кроме того, я получаю дубликаты записей. Скажем, если с сервисом (service1) связаны 2 канала, при получении списка сервисов в списке появляются 2 записи service1.

serviceregistration.java

 @OneToMany(fetch = FetchType.EAGER)
     @JoinTable(name = "multichannel_service_channel", joinColumns = {
     @JoinColumn(name="serviceid", unique = true) 
     },
     inverseJoinColumns = {
     @JoinColumn(name="channelid")
     }
     )
     private Set<Channels> channelsInvolved;


     @OneToMany(mappedBy="serviceRegistration")
     @Cascade(org.hibernate.annotations.CascadeType.REMOVE)
     private List<ServiceChannel> serviceChannels;

servicechannel.java

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column private int servicechannelid;    

@ManyToOne
    @JoinColumn(name = "serviceid")
    private ServiceRegistration serviceRegistration;

@ManyToOne
    @JoinColumn(name = "channelid")
    private Channels channels;

channels.java

@Id
@Column
private int channelid;

@Column
private String channelname;

@Column
private String channeldescription;

@Column
private boolean isactive;

Пожалуйста, помогите решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 10 октября 2011

Вы пытаетесь определить @ManyToMany, или вы пытаетесь эмулировать @ManyToMany с двумя @ManyToOnes? Кажется, вы делаете оба, но это не сработает.

У вас есть два варианта. Во-первых, @ManyToMany:

create table service_channel (
  service_id int not null,
  channel_id int not null,
  primary key (service_id, channel_id));

ServiceRegistration.java

@ManyToMany
@JoinTable(name = "service_channel",
           joinColumns = @JoinColumn(name="service_id"),
           inverseJoinColumns = @JoinColumn(name="channel_id"))
private Set<Channel> channels;

Channel.java

@ManyToMany(mappedBy = "channels")
private Set<Service> services;

где ServiceChannel.java не существует. Во-вторых, вы можете повысить ServiceChannel до статуса объекта и смоделировать все это с помощью двух @OneToManys:

create table service_channel (
  id int not null primary key,
  service_id int not null,
  channel_id int not null);

ServiceChannel.java:

@ManyToOne
@JoinColumn(name = "service_id")
private Service service;

@ManyToOne
@JoinColumn(name = "channel_id")
private Channel channel;

Service.java:

@OneToMany(mappedBy = "service")
private ServiceChannel serviceChannel;

Channel.java:

@OneToMany(mappedBy = "channel")
private ServiceChannel serviceChannel;
0 голосов
/ 10 октября 2011

Вы задаете 2 вопроса сейчас.


Вы не можете удалить службу просто потому, что она передана.Вы должны сначала удалить упомянутые объекты (или обновить их, чтобы сделать службу не упомянутой).

Это означает, что вы должны сначала удалить соответствующие ServiceChannels перед удалением Service.

«Автоматическое» удалениеServiceChannel через Service можно реализовать с помощью каскадного типа «Удалить сироту», который является специфичной для Hibernate функцией.


Для дублированного списка, я полагаю, это зависит от HQL, который вы использовали для получения списка.В случае, если вы присоединились к / извлекаются из serviceChannels, это приведет к дублированию записей.Вы должны либо использовать «выбрать отличный», либо добавить отдельный преобразователь результата для обработки этого.

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