2014-11-23 72 views
0

我收到以下錯誤:缺失列,即使它存在

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`) 
); 

我已經在計算器看了一些相關的資源,如:JPA/Hibernate: "Missing Column" when joining columns,但不能似乎仍然解決它。我一直在調試這幾個小時,任何幫助,將不勝感激。

+0

你忘了添加Person類的代碼。 – 2014-11-23 10:50:26

+0

已添加人員。對不起,關於 – Chad 2014-11-23 10:55:11

回答

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

而且連接繼承要求要麼:

您應該添加:

@PrimaryKeyJoinColumn(name="assignable_id") 

給團隊和個人。

+0

這並沒有解決這個問題。我檢查了文檔和'@ MapsId''似乎與嵌入式ID有關 - 我不確定這是否與「@ IdClass''相同 – Chad 2014-11-23 12:02:57

+0

可以同時擁有@Id列和Join ManyToOne在這[我的GitHub示例]中(https://github.com/vladmihalcea/hibernate-master-class/blob/master/core/src/test/java/com/vladmihalcea/hibernate/masterclass/laboratory/concurrency/OptimisticLockingOneRootEntityMultipleVersionsTest的.java)。 IdClass只是一個古老的EJB2風格的嵌入ID的東西,你不應該使用它。 – 2014-11-23 12:14:16

+0

您需要將引用info的子類添加到Team and Person中的基本Assignable類。檢查我更新的答案。 – 2014-11-23 12:21:42