Hibernate 休眠许多相同的列名称

Hibernate 休眠许多相同的列名称,hibernate,orm,many-to-many,hibernate-mapping,hibernate-4.x,Hibernate,Orm,Many To Many,Hibernate Mapping,Hibernate 4.x,我有两个实体类Activity和User。它们之间的关系是: 一个活动可以有一个或多个用户 一个用户可以属于一个或多个活动 为了实现这一点,我定义了它们之间的映射。以下是我的课程: 活动: @javax.persistence.Entity @Table(name = "ACTIVITY") public class Activity extends Entity { @Transient private static final long serialVersionUID

我有两个实体类
Activity
User
。它们之间的关系是:

  • 一个
    活动
    可以有一个或多个
    用户
  • 一个
    用户
    可以属于一个或多个
    活动
为了实现这一点,我定义了它们之间的映射。以下是我的课程:

活动

@javax.persistence.Entity
@Table(name = "ACTIVITY")
public class Activity extends Entity {

    @Transient
    private static final long serialVersionUID = 4741665931936809028L;

    private Set<User> users;

    public Activity() {
        super();
    }

    @ManyToMany(targetEntity = User.class, cascade = { CascadeType.ALL })
    @JoinTable(name = "ACTIVITY_USER", joinColumns = @JoinColumn(name = "ID"), inverseJoinColumns = @JoinColumn(name = "ID"))
    public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }
}
@MappedSuperclass
public class Entity implements Serializable {

    @Transient
    private static final long serialVersionUID = 7470288121057059283L;

    private Long id;

    public Entity() {
        super();
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", updatable = false, nullable = false, unique = true)
    public Long getId() {
        return id;
    }

    @SuppressWarnings("unused")
    private void setId(Long id) {
        this.id = id;
    }

    public void setLastUpdateTimestamp(Date lastUpdateTimestamp) {
        this.lastUpdateTimestamp = lastUpdateTimestamp;
    }


    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        return prime * result + ((getId() == null) ? super.hashCode() : getId().hashCode());
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (obj == null) {
            return false;
        }

        if (!getClass().equals(HibernateProxyHelper.getClassWithoutInitializingProxy(obj))) {
            return false;
        }

        final Entity other = (Entity) obj;

        if (getId() != other.getId()) {
            if (getId() == null) {
                return false;
            }
            if (!getId().equals(other.getId())) {
                return false;
            }
        }

        return true;
    }
}
上述两个类都扩展了
实体

@javax.persistence.Entity
@Table(name = "ACTIVITY")
public class Activity extends Entity {

    @Transient
    private static final long serialVersionUID = 4741665931936809028L;

    private Set<User> users;

    public Activity() {
        super();
    }

    @ManyToMany(targetEntity = User.class, cascade = { CascadeType.ALL })
    @JoinTable(name = "ACTIVITY_USER", joinColumns = @JoinColumn(name = "ID"), inverseJoinColumns = @JoinColumn(name = "ID"))
    public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }
}
@MappedSuperclass
public class Entity implements Serializable {

    @Transient
    private static final long serialVersionUID = 7470288121057059283L;

    private Long id;

    public Entity() {
        super();
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", updatable = false, nullable = false, unique = true)
    public Long getId() {
        return id;
    }

    @SuppressWarnings("unused")
    private void setId(Long id) {
        this.id = id;
    }

    public void setLastUpdateTimestamp(Date lastUpdateTimestamp) {
        this.lastUpdateTimestamp = lastUpdateTimestamp;
    }


    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        return prime * result + ((getId() == null) ? super.hashCode() : getId().hashCode());
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (obj == null) {
            return false;
        }

        if (!getClass().equals(HibernateProxyHelper.getClassWithoutInitializingProxy(obj))) {
            return false;
        }

        final Entity other = (Entity) obj;

        if (getId() != other.getId()) {
            if (getId() == null) {
                return false;
            }
            if (!getId().equals(other.getId())) {
                return false;
            }
        }

        return true;
    }
}
现在从:

@JoinTable(name = "ACTIVITY_USER", joinColumns = @JoinColumn(name = "ID"), inverseJoinColumns = @JoinColumn(name = "ID"))
据我所知,
joinColumns
@JoinColumn
的名称取一个实体PK的列名,
inverseJoinColumns
@JoinColumn
的名称取另一个实体PK的列名。但在我的例子中,这两个列名是相同的,即
实体
类中的
ID


我的问题是如何避免列名之间的冲突?任何建议都会对我很有帮助。

在同一个表中有两个名称相同的列是没有意义的。因此,只需为列选择一个不同的名称

改变

@JoinTable(name = "ACTIVITY_USER", 
           joinColumns = @JoinColumn(name = "ID"), 
           inverseJoinColumns = @JoinColumn(name = "ID"))


如属性名称所示,您在此处给出的名称是联接表的联接列的名称,即联接表activity\u user中包含活动或用户表外键的列的名称。Hibernate已经知道用户和活动PK的名称:您在各自的
@Id
注释中告诉了它。

在同一个表中有两个名称相同的列是没有意义的。因此,只需为列选择一个不同的名称

改变

@JoinTable(name = "ACTIVITY_USER", 
           joinColumns = @JoinColumn(name = "ID"), 
           inverseJoinColumns = @JoinColumn(name = "ID"))


如属性名称所示,您在此处给出的名称是联接表的联接列的名称,即联接表activity\u user中包含活动或用户表外键的列的名称。Hibernate已经知道用户和活动的PK名称:您在各自的
@Id
注释中告诉了它。

非常感谢您对PK的解释,我错了。非常感谢您对PK的解释,我错了。