休眠正在查找表中不存在的 DTYPE 列



由于某种原因,Hibernate正在表中查找不存在的DTYPE列。我想知道为什么?在我以前的项目中,一切都很好。但是在这里我在层次结构中添加了类自由职业者,似乎不知何故它导致了问题

Hibernate: 
    select
        user0_.id as id2_6_0_,
        user0_.email as email3_6_0_,
        user0_.first_name as first_na4_6_0_,
        user0_.last_name as last_nam5_6_0_,
        user0_.login as login6_6_0_,
        user0_.password as password7_6_0_,
        user0_.DTYPE as DTYPE1_6_0_,
        roles1_.user_id as user_id1_5_1_,
        roles1_.role as role2_5_1_ 
    from
        users user0_ 
    left outer join
        user_roles roles1_ 
            on user0_.id=roles1_.user_id 
    where
        user0_.id=?
WARN  SqlExceptionHelper - SQL Error: 0, SQLState: 42703
ERROR SqlExceptionHelper - ERROR: column user0_.dtype does not exist
  Position: 197
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet

等级制度。映射的超类:

@MappedSuperclass
@Access(AccessType.FIELD)
public class BaseEntity implements Persistable<Integer> {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    @Access(value = AccessType.PROPERTY)
    protected Integer id;
    public BaseEntity() {
    }
//getters and setters
}

比实体用户:

@Entity
@Table(name = "users")
public class User extends BaseEntity {
    @Column(name = "login")
    private String login;
    @Column(name = "password")
    private String password;
    @Column(name = "first_name")
    private String firstName;
    @Column(name = "last_name")
    private String lastName;
    @Column(name = "email")
    private String email;
    @Enumerated(EnumType.STRING)
    @CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"))
    @Column(name = "role")
    @ElementCollection(fetch = FetchType.EAGER)
    protected Set<Role> roles;
    public User(){}
//getters and setters
}

我有实体自由职业者

@Entity
public class Freelancer extends User {
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(
            name = "freelancer_skills",
            joinColumns = {@JoinColumn(name = "freelancer_id")},
            inverseJoinColumns = {@JoinColumn(name = "skill_id")}
    )
    private Set<Skill> skills;
    public Freelancer(){}
//getters and setters
}

更新:角色类

import org.springframework.security.core.GrantedAuthority;
public enum Role implements GrantedAuthority {
    USER,
    ADMIN,
    FREELANCER,
    CLIENT;
    @Override
    public String getAuthority() {
        return name();
    }
}
@Enumerated(EnumType.STRING)
@CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"))
@Column(name = "role")
@ElementCollection(fetch = FetchType.EAGER)

这看起来很奇怪

@Column(name = "role")

既然您正在加入集合并尝试映射到列?

编辑:我没有仔细阅读。您应该使用某种类型的休眠继承。阅读 http://www.thoughts-on-java.org/complete-guide-inheritance-strategies-jpa-hibernate/.我认为这可能是一个问题。自由职业者有自己的单独表吗?

我了解到我应该像这样拆分Hibernate的类层次结构:

public class BaseUser extends BaseEntity {
    @Column(name = "login")
    private String login;
    @Column(name = "password")
    private String password;
    @Column(name = "first_name")
    private String firstName;
    @Column(name = "last_name")
    private String lastName;
    @Column(name = "email")
    private String email;
    @Enumerated(EnumType.STRING)
    @CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"))
    @Column(name = "role")
    @ElementCollection(fetch = FetchType.EAGER)
    protected Set<Role> roles;

    public BaseUser(){}
}

比我应该扩展基本用户来创建实体用户:

@Entity
@Table(name = "users")
public class User extends BaseUser {
public User(){}
}

并创建实体自由职业者:

@Entity
public class Freelancer extends BaseUser {
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(
            name = "freelancer_skills",
            joinColumns = {@JoinColumn(name = "freelancer_id")},
            inverseJoinColumns = {@JoinColumn(name = "skill_id")}
    )
    private Set<Skill> skills;
    public Freelancer(){}
}

所以它现在工作正常..

这是因为 hibernate 想要指定模型类型。在本例中,您有 2 个模型和 1 个数据库表。

你可以(postgres示例(:

alter table users add dtype varchar(31) not null default 'Freelancer';
alter table users alter column dtype drop default ;

然后,可以生成和部署。

最新更新