@Entity
@Table(name="u_group")
public class Group {
private int id;
private String name;
private int age;
private Set<User> users=new HashSet<User>(); @Id
@GeneratedValue
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @OneToMany
@Cascade(value={CascadeType.DELETE})
public Set<User> getUsers() {
return users;
} public void setUsers(Set<User> users) {
this.users = users;
}
}
@Entity
public class User {
private int id;
private String name;
@Id
@GeneratedValue
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}@Test
public void testGroup_User(){
Group g=new Group();
g.setId(3); Session session=sessionFactory.getCurrentSession();
session.beginTransaction();
session.delete(g);
session.getTransaction().commit();
}
Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`hibernate/user`, CONSTRAINT `FK285FEB5156FC9E` FOREIGN KEY (`group_id`) REFERENCES `u_group` (`id`))
at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1269)
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:955)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 28 more
Hibernatedelete
但总觉得这个cascade规则应该用在ManyToOne一侧
我现在写的是一对多关联,多对多关联还没写,我试下吧
不是多对多,是多对一,也就是一对多的反面,一个一对多的关系必定跟着一个多对一,只是可能是隐性的没有被声明在entity里在你的情况就是在user这个entity里的group属性
我现在写的是一对多关联,多对多关联还没写,我试下吧
不是多对多,是多对一,也就是一对多的反面,一个一对多的关系必定跟着一个多对一,只是可能是隐性的没有被声明在entity里在你的情况就是在user这个entity里的group属性我写了多对多情况是可以级联删除的,我想分别一对多,多对一级联删除
用hibernate建的表,没看。不过我多对多关联能级联删除应该是OK的
用hibernate建的表,没看。不过我多对多关联能级联删除应该是OK的
你这个删不掉是因为发现了有其他表引用了这个表,而你删除的时候只给了ID。
应该先将ID为3的先查询出来,再delete,因为你只给了ID=3
groupId=null where groupId=null;
建议删除group的时候先load一下,然后再delete就不会报错了
如果你想当一个group被删除时所有这个group里的Users都被删除则在onDelete的Constraint里cascade不可能当删除一个User时删除他的Group所以我觉得是应该在User侧也就是你的ManyToOne那里声明cascade
Session session=sessionFactory.getCurrentSession();
session.beginTransaction();
Group g=(Group)session.get(Group.class, 2);
session.delete(g);
session.getTransaction().commit();
这个在一对多的情况下还是不行,到目前为止我是了很多方法,只有在User那边也设ManyToOne并级联才成功,也就是多对多的情况
如果我group1里有2个User 一个U1,一个U2
那么我删除U1的时候你就把group1删掉,那U2是不是也跟着被删掉了,可是我不想删U2
,所以我觉得应该设在OneToMany 的cascade 为delete
你就把group ID为3的先get出来 再delete 应该是OK的,
你没查出来,hibernate就只知道你Group ID为3的里没有User,而删除时,他发现了,就报错了
相反,你查出来了,他就发现了Group ID为3的里有User,然后他就会删除User
我说的一对多关联是:将id 为1 的group删掉,那么group 1 中的user都将删掉
而不是当删除一个User时删除他的Group,因为group可以有很多user
如果我group1里有2个User 一个U1,一个U2
那么我删除U1的时候你就把group1删掉,那U2是不是也跟着被删掉了,可是我不想删U2
,所以我觉得应该设在OneToMany 的cascade 为delete不知道有没有看过sql服务器里你设置的FK?
当你有一个Group User 的OneToMany关系时,User这个table里会有一个group_id而这个group_id上会有一个FK constraint连接Group表的PK,而Group表没有任何User信息。我说的在ManyToOne侧定义这个constraint并不代表当删除一个User时要删除其Group(上个回复最后一句话),而是因为一个FK真正的定义是在这一侧,而他表示的意思也是,当被引用行(即Group表中的一行)被删除时,我该怎么办
是这样吗????????????
也许是因为你用的org.hibernate.annotations.CascadeType.DELETE
我用的JPA的javax.persistence.CascadeType.REMOVE
我这个可以,你那个我没试
也许是因为你用的org.hibernate.annotations.CascadeType.DELETE
我用的JPA的javax.persistence.CascadeType.REMOVE
我这个可以,你那个我没试这个我试了,一对多失败,你是一对多吗?
public Set<User> getUsers() {
return users;
} Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
Group group = (Group) session.get(Group.class, 1L);
session.delete(group);
session.getTransaction().commit();
public Group getGroup() {
return group;
}
这两个很可能是一个概念,可以试着通过看源码验证
Hibernate习惯用delete,JPA是remove,但一个意思,hibernate内部做了统一指向
这句话有问题,应该是inverse="false"就不会报错了的,这样就控制了关系,会发update t_user set groupId=null where groupId=?
再次建议你两种解决方案:一,set端设置inverse=false。
二,删除group的时候load上来再删除,此时也必须设置级联……
网上好多都是xml配置文件写的,38楼的说的是xml配置文件里面的吧?
Group group=session.get(id); //(id为groupid)
for(User user:group.getUsers()){
user.setGroup(null);
}
session.delete(group);
上面说的什么啊 好多啊 一对多单向就单向喽
首先 你的那个Group g=new Group(); g.setId(3);这哥们 是瞬时态
楼主是想根据 Id 删除某个group 还是里面的人也删除
要是删除 group 人留着 就 下边
Group g=session.get(Group.class;"3"); 得到持久态
Set<User> set=g.getSet(); 得到里面所有的用户
循环用户 的到每一个用户 user user.setGroup(null); 断掉关系
然后 session.delete(g); 删除 group如果要里面的user 全部删掉 就把取出来的 user session.delete(user);级联关闭 手动先删掉关系 在删掉多的一方
Very Important Note: If the <key> column of a <one-to-many> association is declared NOT NULL, Hibernate may cause constraint violations when it creates or updates the association. To prevent this problem, you must use a bidirectional association with the many valued end (the set or bag) ed as inverse="true".