Hibernate正在寻找表中不存在的DTYPE列

时间:2017-03-22 11:30:57

标签: java hibernate jpa

出于某种原因,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
}

upd:角色类

import org.springframework.security.core.GrantedAuthority;

public enum Role implements GrantedAuthority {
    USER,
    ADMIN,
    FREELANCER,
    CLIENT;

    @Override
    public String getAuthority() {
        return name();
    }
}

2 个答案:

答案 0 :(得分:0)

public void StartTask(Task t)
{
    if (t.Status == TaskStatus.Running)
        return;
    else
        t.Start();
}

这看起来很奇怪

@Enumerated(EnumType.STRING)
@CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"))
@Column(name = "role")
@ElementCollection(fetch = FetchType.EAGER)

因为您正在加入收集并尝试映射到列?

编辑: 我没仔细看过。你应该使用某种类型的hibernate继承。阅读http://www.thoughts-on-java.org/complete-guide-inheritance-strategies-jpa-hibernate/。我认为这可能是一个问题。自由职业者是否拥有独立的桌子?

答案 1 :(得分:0)

我了解到我应该将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(){}
}

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

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

public User(){}
}

并创建实体Freelancer:

@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(){}
}

所以它现在可以正常工作..