0

2つのエンティティクラスActivityとがありUserます。それらの間の関係は次のとおりです。

  • 1Activityつまたは複数を持つことができますUser
  • 1Userつまたは複数に属することができますActivity

したがって、これを実現するために@ManyToMany、それらの間のマッピングを定義しました。以下は私のクラスです:

Activity

@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;
    }
}

User

@javax.persistence.Entity
@Table(name = "USER")
public class User extends Entity {

    @Transient
    private static final long serialVersionUID = -112950002831333869L;

    private Set<Activity> activities;

    public User() {
        super();
    }

    @ManyToMany(cascade = { CascadeType.ALL }, mappedBy = "users", targetEntity = Activity.class)
    public Set<Activity> getActivities() {
        return activities;
    }

    public void setActivities(Set<Activity> activities) {
        this.activities = activities;
    }
}

上記のクラスは両方とも拡張されますEntity

@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"))

ofの名前は、あるエンティティのPKの列名を取り、ofの名前は、別のエンティティのPKの列名をとること@JoinColumnを理解しています。しかし、私の場合、両方の列名は同じです。つまり、クラスからのものです。joinColumns@JoinColumninverseJoinColumnsIDEntity

私の質問は、この列名の競合をどのように回避できるかということです。どんな提案も私にとって非常に役に立ちます。

4

1 に答える 1

5

同じテーブルに同じ名前の列が 2 つあるのは意味がありません。そのため、列に別の名前を選択してください。

変化する

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

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

属性の名前が示すように、そこで指定する名前は、結合テーブルの一部である結合列の名前、つまり、結合テーブル ACTIVITY_USER 内のアクティビティ テーブルまたはユーザー テーブルへの外部キーを保持する列の名前です。Hibernate はすでに User と Activity の PK の名前を知っています: それぞれの注釈でそれを伝えました。@Id

于 2013-02-23T08:30:01.750 に答える