【问题标题】:java EE Hibernate List many to many configure errorjava EE Hibernate List many to many configure error
【发布时间】: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


【解决方案1】:

在多对多映射中缺少 packageName。将其从 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多