我收到以下错误:
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但似乎无法修复它。我已经调试了几个小时了,任何帮助都将不胜感激。
答案 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")
团队和人员。