JPA中缺少列,即使它存在

时间:2014-11-23 09:58:23

标签: java mysql hibernate jpa

我收到以下错误:

Caused by: org.hibernate.HibernateException: Missing column: member_assignable_id in aguil.membership

我发现这很不寻常,因为我只是从早期的实现中复制了模式(更改了一些名称,但仍然大致相同)。

以下是我的实体类的设置:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "assignable",
        uniqueConstraints = @UniqueConstraint(columnNames = {"alias"}))
public abstract class Assignable {

    private Long assignableId;

    private String alias;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "assignable_id")
    public Long getAssignableId() {
        return assignableId;
    }

    public void setAssignableId(Long assignableId) {
        this.assignableId = assignableId;
    }

    @Column(name = "alias", nullable = false)
    public String getAlias() {
        return alias;
    }

    public void setAlias(String alias) {
        this.alias = alias;
    }
}


@Entity
@Table(name = "team")
public class Team extends Assignable {

    private Set<Membership> memberships;

    @OneToMany(mappedBy = "team")
    public Set<Membership> getMemberships() {
        return memberships;
    }

    public void setMemberships(Set<Membership> memberships) {
        this.memberships = memberships;
    }
}

@Entity
@Table(name = "person",
        uniqueConstraints = {
            @UniqueConstraint(columnNames = {"email"}),
            @UniqueConstraint(columnNames = {"username"})
        })
public class Person extends Assignable {

    private String username;

    private String firstName;

    private String lastName;

    private String email;

    private String password;

    private Set<Membership> memberships;

    @Column(name = "username", nullable = false)
    public String getUsername() {
        return username;
    }

    public void setUsername(String firstName) {
        this.username = username;
    }

    @Column(name = "first_name", nullable = false)
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @Column(name = "last_name", nullable = false)
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Column(name = "email", nullable = false)
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Column(name = "password", nullable = false)
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @OneToMany(mappedBy = "member")
    public Set<Membership> getMemberships() {
        return memberships;
    }

    public void setMemberships(Set<Membership> memberships) {
        this.memberships = memberships;
    }
}

@Entity
@IdClass(MembershipKey.class)
@Table(name = "membership")
public class Membership {

    private Long memberId;

    private Long teamId;

    private Person member;

    private Team team;

    @Id
    @Column(name = "member_id")
    public Long getMemberId() {
        return memberId;
    }

    public void setMemberId(Long memberId) {
        this.memberId = memberId;
    }

    @Id
    @Column(name = "team_id")
    public Long getTeamId() {
        return teamId;
    }

    public void setTeamId(Long teamId) {
        this.teamId = teamId;
    }

    @ManyToOne(targetEntity = Person.class)
    @PrimaryKeyJoinColumn(name = "member_id", referencedColumnName = "assignable_id")
    public Person getMember() {
        return member;
    }

    public void setMember(Person member) {
        this.member = member;
    }

    @ManyToOne(targetEntity = Team.class)
    @PrimaryKeyJoinColumn(name = "team_id", referencedColumnName = "assignable_id")
    public Team getTeam() {
        return team;
    }

    public void setTeam(Team team) {
        this.team = team;
    }
}

以下是我的sql脚本:

CREATE TABLE `aguil`.`assignable` (
  `assignable_id` BIGINT NOT NULL AUTO_INCREMENT,
  `alias` VARCHAR(255) NOT NULL,
  CONSTRAINT `pk_assignable` PRIMARY KEY (`assignable_id`),
  CONSTRAINT `uc_assignable_alias` UNIQUE (`alias`)
);

CREATE TABLE `aguil`.`person` (
  `assignable_id` BIGINT NOT NULL,
  `username` VARCHAR(255) NOT NULL,
  `first_name` VARCHAR(255) NOT NULL,
  `last_name` VARCHAR(255) NOT NULL,
  `email` VARCHAR(255) NOT NULL,
  `password` VARCHAR(255) NOT NULL,
  CONSTRAINT `pk_person` PRIMARY KEY (`assignable_id`),
  CONSTRAINT `fk_person_assignable_inheritance`
    FOREIGN KEY (`assignable_id`)
    REFERENCES `aguil`.`assignable` (`assignable_id`),
  CONSTRAINT `uc_person_username` UNIQUE (`username`),
  CONSTRAINT `uc_person_email` UNIQUE (`email`)
);

CREATE TABLE  `aguil`.`team` (
  `assignable_id` BIGINT NOT NULL,
  CONSTRAINT `pk_team` PRIMARY KEY (`assignable_id`),
  CONSTRAINT `fk_team_assignable_inheritance`
    FOREIGN KEY (`assignable_id`)
    REFERENCES `aguil`.`assignable` (`assignable_id`)
);

CREATE TABLE `aguil`.`membership` (
  `member_id` BIGINT NOT NULL,
  `team_id` BIGINT NOT NULL,
  CONSTRAINT `pk_membership` PRIMARY KEY (`member_id`, `team_id`),
  CONSTRAINT `fk_membership_assignable_members`
    FOREIGN KEY (`member_id`)
    REFERENCES `aguil`.`person` (`assignable_id`),
  CONSTRAINT `fk_membership_team_teams`
    FOREIGN KEY (`team_id`)
    REFERENCES `aguil`.`team` (`assignable_id`)
);

我已经在stackoverflow中阅读了一些相关资源,例如:JPA/Hibernate: "Missing Column" when joining columns但似乎无法修复它。我已经调试了几个小时了,任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

尝试将更改成员资格@ManyToOne关联添加到我们@MapsId:

@ManyToOne(targetEntity = Person.class)
@MapsId
@JoinColumn(name = "member_id", referencedColumnName = "assignable_id")
public Person getMember() {
    return member;
}

@ManyToOne(targetEntity = Team.class)     
@MapsId
@JoinColumn(name = "team_id", referencedColumnName = "assignable_id")
public Team getTeam() {
    return team;
}

JOINED继承还需要:

你应该添加:

@PrimaryKeyJoinColumn(name="assignable_id")

团队和人员。