Я делаю веб-приложение java ee. У меня есть классы пользователей и разрешений, а в классе пользователей есть список этих типов разрешений. Когда hibernate получает базу данных формы пользовательского объекта, я также хочу получить разрешения пользователя из таблицы user_permission. Пользователь и разрешение имеют отношение «многие ко многим». Я использую Hibernate 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
в теге «многие ко многим» class=Permission измените его на model.Permission
О спасибо решил мою проблему






В сопоставлении многие ко многим отсутствует имя пакета. Измените его с Permission на model.Permission. Это должно решить проблему. Ниже sippet
<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 = "model.Permission" column = "permission_id"/> </list> </class> </hibernate-mapping>
это должно быть один ко многим не многие ко многим