无法删除或更新父行:外键约束失败(hibernate xml映射)
我想删除所有的组,其中一个用户是所有者,但它目前不起作用。我认为在映射User.hbm.xml或Group.hbm.xml的级别上缺少一些东西,但我不知道。错误为“无法删除或更新父行:外键约束失败(无法删除或更新父行:外键约束失败(hibernate xml映射),hibernate,hibernate-mapping,Hibernate,Hibernate Mapping,我想删除所有的组,其中一个用户是所有者,但它目前不起作用。我认为在映射User.hbm.xml或Group.hbm.xml的级别上缺少一些东西,但我不知道。错误为“无法删除或更新父行:外键约束失败(sharedmapgroupe,约束FK_gq7win10rtxufsxu1n5istm2p外键(用户id)引用用户(id)” 以下是与xml相关的类和文件: User.java public class User { /** Attributs */ @XmlTransien
sharedmap
groupe
,约束FK_gq7win10rtxufsxu1n5istm2p
外键(用户id
)引用用户
(id
)”
以下是与xml相关的类和文件:
User.java
public class User {
/** Attributs */
@XmlTransient
private Set<Group> proprietaire;
/** Constructeur */
public User() {
}
public User(String telephone, String pseudo, String email) {
super();
this.pseudo = pseudo;
this.telephone = telephone;
this.email = email;
}
public Set<Group> getProprietaire() {
return proprietaire;
}
public void setProprietaire(Set<Group> proprietaire) {
this.proprietaire = proprietaire;
}
...
}
public class UserDaoTest {
private final String tel = "0601020304";
private final String pseudo = "pseudo";
private final String pseudoModified = "pseudo2";
private final String email = "email@email.com";
@Test
public void addUserTest(){
User initialUser = new User(tel, pseudo, email);
// Add user in database
UserDao.addUser(initialUser);
User addedUser = UserDao.getUser(tel);
// Add Group in User
Group group = new Group();
group.setDescription("description");
group.setHashtag("hashtag");
group.setPassword("password");
//Set group proprietaire
group.setProprietaire(addedUser);
//Add group in database
GroupDao.addGroup(group);
// Add Group in User
Set<Group> groups = new HashSet<Group>();
groups.add(group);
addedUser.setGroups(groups);
Assert.assertEquals(addedUser.getTelephone(), initialUser.getTelephone());
Assert.assertEquals(addedUser.getPseudo(), initialUser.getPseudo());
Assert.assertEquals(addedUser.getEmail(), initialUser.getEmail());
}
@Test
public void deleteUserTest(){
User user = UserDao.getUser(tel);
UserDao.deleteUser(user.getTelephone());
List<User> listUsers = UserDao.listUser();
Assert.assertFalse(listUsers.contains(user));
}
}
User.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="modele.User" table="user">
<meta attribute="class-description">
This class contains the user detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="pseudo" column="pseudo" type="string"/>
<property name="telephone" column="telephone" type="string" not-null="true" unique="true"/>
<property name="email" column="email" type="string"/>
<!-- Mapping Set<Demande> demandes -->
<set name="demandes" cascade="save-update,delete" lazy="false">
<key column="demandeur_id"/>
<one-to-many class="modele.Demande"/>
</set>
<!-- Mapping Set<Invitation> aInvite -->
<set name="aInvite" cascade="save-update,delete" lazy="false">
<key column="inviteur_id"/>
<one-to-many class="modele.Invitation"/>
</set>
<set name="notifications" cascade="save-update,delete" lazy="false">
<key column="user_id"/>
<one-to-many class="modele.Notification"/>
</set>
<set name="groups" table="participation" lazy="false" inverse="true">
<key column="user_id"/>
<many-to-many column="group_id" class="modele.Group"/>
</set>
<!-- Mapping Set<Group> proprietaire -->
<set name="proprietaire" cascade="save-update,delete" lazy="false">
<key column="user_id"/>
<one-to-many class="modele.Group"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="modele.Group" table="groupe">
<meta attribute="class-description">
This class contains the publicEvent detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="description" column="description" type="string"/>
<property name="hashtag" column="hashtag" type="string"/>
<property name="password" column="password" type="string"/>
<!-- Mapping ArrayList<Marqueur> marqueurs -->
<set name="marqueurs" cascade="save-update,delete" lazy="false">
<key column="group_id"/>
<one-to-many class="modele.Marqueur"/>
</set>
<!-- Mapping Set<Invitation> invitations -->
<set name="invitations" cascade="save-update,delete" lazy="false">
<key column="group_id"/>
<one-to-many class="modele.Invitation"/>
</set>
<!-- Mapping Set<Demande> demandes -->
<set name="demandes" cascade="save-update,delete" lazy="false">
<key column="group_id"/>
<one-to-many class="modele.Demande"/>
</set>
<!-- Mapping User proprietaire -->
<many-to-one name="proprietaire" class="modele.User" column="user_id" not-null="true"/>
<!-- Mapping ArrayList<User> invites -->
<set name="invites" table="participation" lazy="false">
<key column="group_id"/>
<many-to-many column="user_id" class="modele.User"/>
</set>
</class>
</hibernate-mapping>
此类包含用户详细信息。
Group.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="modele.User" table="user">
<meta attribute="class-description">
This class contains the user detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="pseudo" column="pseudo" type="string"/>
<property name="telephone" column="telephone" type="string" not-null="true" unique="true"/>
<property name="email" column="email" type="string"/>
<!-- Mapping Set<Demande> demandes -->
<set name="demandes" cascade="save-update,delete" lazy="false">
<key column="demandeur_id"/>
<one-to-many class="modele.Demande"/>
</set>
<!-- Mapping Set<Invitation> aInvite -->
<set name="aInvite" cascade="save-update,delete" lazy="false">
<key column="inviteur_id"/>
<one-to-many class="modele.Invitation"/>
</set>
<set name="notifications" cascade="save-update,delete" lazy="false">
<key column="user_id"/>
<one-to-many class="modele.Notification"/>
</set>
<set name="groups" table="participation" lazy="false" inverse="true">
<key column="user_id"/>
<many-to-many column="group_id" class="modele.Group"/>
</set>
<!-- Mapping Set<Group> proprietaire -->
<set name="proprietaire" cascade="save-update,delete" lazy="false">
<key column="user_id"/>
<one-to-many class="modele.Group"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="modele.Group" table="groupe">
<meta attribute="class-description">
This class contains the publicEvent detail.
</meta>
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="description" column="description" type="string"/>
<property name="hashtag" column="hashtag" type="string"/>
<property name="password" column="password" type="string"/>
<!-- Mapping ArrayList<Marqueur> marqueurs -->
<set name="marqueurs" cascade="save-update,delete" lazy="false">
<key column="group_id"/>
<one-to-many class="modele.Marqueur"/>
</set>
<!-- Mapping Set<Invitation> invitations -->
<set name="invitations" cascade="save-update,delete" lazy="false">
<key column="group_id"/>
<one-to-many class="modele.Invitation"/>
</set>
<!-- Mapping Set<Demande> demandes -->
<set name="demandes" cascade="save-update,delete" lazy="false">
<key column="group_id"/>
<one-to-many class="modele.Demande"/>
</set>
<!-- Mapping User proprietaire -->
<many-to-one name="proprietaire" class="modele.User" column="user_id" not-null="true"/>
<!-- Mapping ArrayList<User> invites -->
<set name="invites" table="participation" lazy="false">
<key column="group_id"/>
<many-to-many column="user_id" class="modele.User"/>
</set>
</class>
</hibernate-mapping>
此类包含publicEvent详细信息。
UserDaoTest.java
public class User {
/** Attributs */
@XmlTransient
private Set<Group> proprietaire;
/** Constructeur */
public User() {
}
public User(String telephone, String pseudo, String email) {
super();
this.pseudo = pseudo;
this.telephone = telephone;
this.email = email;
}
public Set<Group> getProprietaire() {
return proprietaire;
}
public void setProprietaire(Set<Group> proprietaire) {
this.proprietaire = proprietaire;
}
...
}
public class UserDaoTest {
private final String tel = "0601020304";
private final String pseudo = "pseudo";
private final String pseudoModified = "pseudo2";
private final String email = "email@email.com";
@Test
public void addUserTest(){
User initialUser = new User(tel, pseudo, email);
// Add user in database
UserDao.addUser(initialUser);
User addedUser = UserDao.getUser(tel);
// Add Group in User
Group group = new Group();
group.setDescription("description");
group.setHashtag("hashtag");
group.setPassword("password");
//Set group proprietaire
group.setProprietaire(addedUser);
//Add group in database
GroupDao.addGroup(group);
// Add Group in User
Set<Group> groups = new HashSet<Group>();
groups.add(group);
addedUser.setGroups(groups);
Assert.assertEquals(addedUser.getTelephone(), initialUser.getTelephone());
Assert.assertEquals(addedUser.getPseudo(), initialUser.getPseudo());
Assert.assertEquals(addedUser.getEmail(), initialUser.getEmail());
}
@Test
public void deleteUserTest(){
User user = UserDao.getUser(tel);
UserDao.deleteUser(user.getTelephone());
List<User> listUsers = UserDao.listUser();
Assert.assertFalse(listUsers.contains(user));
}
}
公共类UserDaoTest{
专用最终字符串电话=“0601020304”;
私有最终字符串pseudo=“pseudo”;
私有最终字符串pseudoModified=“pseudo2”;
私人最终字符串电子邮件=”email@email.com";
@试验
public void addUserTest(){
User initialUser=新用户(电话、伪用户、电子邮件);
//在数据库中添加用户
UserDao.addUser(initialUser);
用户addedUser=UserDao.getUser(tel);
//在用户中添加组
组=新组();
组。设置说明(“说明”);
setHashtag(“hashtag”);
设置密码(“密码”);
//集合群属性
setProprietaire组(addedUser);
//在数据库中添加组
GroupDao.addGroup(group);
//在用户中添加组
Set groups=newhashset();
组。添加(组);
addedUser.setGroups(组);
Assert.assertEquals(addedUser.getTelephone(),initialUser.getTelephone());
Assert.assertEquals(addedUser.getPseudo(),initialUser.getPseudo());
Assert.assertEquals(addedUser.getEmail(),initialUser.getEmail());
}
@试验
公共void deleteUserTest(){
User=UserDao.getUser(电话);
UserDao.deleteUser(user.getTelephone());
List listUsers=UserDao.listUser();
Assert.assertFalse(listUsers.contains(user));
}
}
请尝试将inverse=true添加到用户文件集名称privative中,并使用cascade=all“删除孤立文件”
当用户被删除时,它将删除组。另外,请特别注意在Hibernate中删除用户的方式:
删除用户之前必须刷新会话。必须从所有活动会话和二级缓存中删除所有链接到用户的组。需要理解的代码很多,请您将其缩减为所需的代码。我删除了部分代码,并在问题中添加了错误跟踪。这个答案几乎无法理解。“用户文件集名称”也有什么用“什么意思?