【发布时间】:2019-07-26 13:44:39
【问题描述】:
我正在制作一个 java ee Web 应用程序。我有用户和权限类,用户类有列出权限类型。当hibernate获取用户对象表单数据库时,我也想从user_permission表中获取用户的权限。用户和权限是多对多的关系。我正在使用休眠 5.4.1 。当 SessionFactory 配置我得到这个错误:
java.lang.NullPointerException
org.hibernate.boot.model.source.internal.hbm.ModelBinder$AbstractPluralAttributeSecondPass.bindCollectionElement(ModelBinder.java:3557)
org.hibernate.boot.model.source.internal.hbm.ModelBinder$AbstractPluralAttributeSecondPass.doSecondPass(ModelBinder.java:3136)
org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1684)
org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1652)
org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:286)
org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:473)
org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:84)
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:689)
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
我的用户类:
public class User
{
private int id;
private String name;
private String password;
private List<Permission> permissions;
public User(){}
public User(String name,String password)
{
this.name=name;
this.password=password;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name=name;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password=password;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id=id;
}
public void clearPermissions()
{
permissions.clear();
}
public boolean hasPermission(Permission permission)
{
return permissions.contains(permission);
}
public void addPermission(Permission permission)
{
permissions.add(permission);
}
public void deletePermission(Permission permission)
{
permissions.remove(permission);
}
public List<Permission> getPermissions()
{
return permissions;
}
public void setPermissions(List<Permission> permissions)
{
this.permissions = permissions;
}
}
用户类映射:
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping>
<class name="model.User" table="user">
<id name="id" type="int" column="id">
<generator class="identity"/>
</id>
<property name="name" column="name" type="string"/>
<property name="password" column="password" type="string"/>
<list name="permissions" table="user_permission" lazy="false">
<key column="user_id"/>
<index column="id"/>
<many-to-many class="Permission" column="permission_id"/>
</list>
</class>
</hibernate-mapping>
我的权限类:
public class Permission
{
private int id;
private String name;
public Permission() {}
public Permission(int id, String name)
{
this.id=id;
this.name=name;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name=name;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id=id;
}
public boolean equals(Object obj)
{
return ((Permission)obj).id==id;
}
}
权限类映射:
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping>
<class name="model.Permission" table="permission">
<id name="id" type="int" column="id">
<generator class="identity"/>
</id>
<property name="name" column="name" type="string"/>
</class>
</hibernate-mapping>
【问题讨论】:
-
应该是一对多而不是多对多
-
但是在数据库中用户和权限表是多对多的。因为一个权限可以给很多用户,一个用户可以有很多权限。
-
在多对多关系中,我们得到第三个表,它在哪里定义?
-
第三个表名是 'user_permission' 。该表有 3 列:id,user_id,permission_id
-
哦,谢谢它解决了我的问题
标签: mysql hibernate jsp jakarta-ee