2011-10-10 84 views
0

我在休眠JPA注释一对多关系工作,这里是我的表和实体类的细节...Hibernate注解一个一对多的亲子删除

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表有服务ID和channelid作为forign键..我可以获取,修改记录。

  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; 

请帮助解决这个问题。

回答

0

你现在在问2个问题。


仅仅因为被引用而无法删除服务。 您应该先删除被引用的实体(或更新它们以使服务不被引用)。

这意味着,您应该先删除相应的ServiceChannels,然后再删除Service。

通过Service的“自动”删除ServiceChannel可以通过级联类型“Delete Orphan”来实现,这是Hibernate特有的功能。


对于重复的名单,我相信这取决于你用于检索列表中的HQL。如果您已加入/加入获取的serviceChannels,它将导致重复的记录。您应该使用“select distinct”或添加一个不同的结果转换器来处理该转换。

+0

Thanks al ot为你的答案,这是我试过..... ** @ OneToMany(mappedBy =“serviceRegistration”) @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) private List serviceChannels; **我得到的错误.....批量更新返回意外的行数从ü pdate [0];实际行数:0;预计:1;嵌套异常是org.hibernate.S taleStateException:批处理更新从update [0]返回意外的行计数; 实际行数:0;预计:1 – Surez

+0

我不知道你跑了什么,我认为没有人可以帮助你。但是,根据我的经验,StaleStateException似乎是另一个与此问题无关的问题。你可以做一个简单的测试,试试DELETE_ORPHAN,并确保你知道你正确使用它?我担心你的代码中不仅有一个问题会使你的问题复杂化。 –

0

你想要定义一个@ManyToMany,或者你是否试图用两个@ManyToOnes来模拟@ManyToMany?似乎你正在做这两件事,这是行不通的。

您有两种选择。首先,@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; 

通道.java:

@OneToMany(mappedBy = "channel") 
private ServiceChannel serviceChannel; 
+0

好的非常感谢。我会根据你的建议尝试...... – Surez