首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

annotation级联删除有关问题

2012-04-07 
annotation级联删除问题各位大侠我用注解配置一个多的实体一个用户 一个代码 为什么我删除多的一方的数据

annotation级联删除问题
各位大侠我用注解配置一个多的实体

一个用户 一个代码 为什么我删除多的一方的数据时候跟他与之相关的用户那条数据也被删除了 废话不多说上代码请各位大侠多多指教

用户的
package com.sxt.model;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;



@Entity
@SequenceGenerator(name="sequence",sequenceName="seq_test",allocationSize=1)
@Table(name="msuser")
public class User {

private int userId;

private String userName;

private int sex;

private int age;

private int salary;

private IdCard idCard;

private Set<Address> addSet=new HashSet<Address>();

@OneToOne(cascade=CascadeType.ALL,mappedBy="user")
public IdCard getIdCard() {
return idCard;
}

public void setIdCard(IdCard idCard) {
this.idCard = idCard;
}

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="sequence")
@Column(name="userId",unique=true,nullable=true)
public int getUserId() {
return userId;
}

public void setUserId(int userId) {
this.userId = userId;
}
@Column(name="userName")
public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}
@Column(name="sex")
public int getSex() {
return sex;
}

public void setSex(int sex) {
this.sex = sex;
}
@Column(name="age")
public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
@Column(name="salary")
public int getSalary() {
return salary;
}

public void setSalary(int salary) {
this.salary = salary;
}
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="user")
public Set<Address> getAddSet() {
return addSet;
}

public void setAddSet(Set<Address> addSet) {
this.addSet = addSet;
}


}
地址的
package com.sxt.model;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;

@Entity
@SequenceGenerator(name="sequence",sequenceName="seq_test",allocationSize=1)
@Table(name="address")
public class Address {
private String addrName;

private int addrId;

private User user;

public Address(){}

public Address(String addrName, int addrId, User user) {
super();
this.addrName = addrName;
this.addrId = addrId;
this.user = user;
}
@Column(name="addr_name")
public String getAddrName() {
return addrName;
}

public void setAddrName(String addrName) {
this.addrName = addrName;
}
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="sequence")


@Column(name="addr_id")
public int getAddrId() {
return addrId;
}

public void setAddrId(int addrId) {
this.addrId = addrId;
}

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="user_id")
@OnDelete(action=OnDeleteAction.NO_ACTION)
public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}


}
然后删除的方法。。
private static void deleteUserandAddr() {

Address add1=new Address();
Configuration cf=new AnnotationConfiguration();

cf.configure("hibernate.cfg.xml");

SessionFactory sf=cf.buildSessionFactory();

Session session=sf.openSession();
//开启事务

session.beginTransaction();

User user=(User) session.load(User.class, 124);

System.out.println(user.getUserName());

Set<Address> addrSet=user.getAddSet();

for (Address address : addrSet) {
System.out.println(address.getAddrName());
if(address.getAddrName().equals("广州")){
System.out.println("广州我来了");
user.getAddSet().remove(address);
session.delete(address);
}
}
//提交事务
session.getTransaction().commit();

session.close();

sf.close();
}
执行的时候显示的sql语句
Hibernate: 
  delete 
  from
  address 
  where
  addr_id=?
Hibernate: 
  delete 
  from
  address 
  where
  addr_id=?
Hibernate: 
  delete 
  from
  msuser 
  where
  userId=?

[解决办法]
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="user")
public Set<Address> getAddSet() {
return addSet;
}
把上面cascade属性去掉,或者改成其他的···

热点排行