出于某种原因,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();
}
}
答案 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(){}
}
所以它现在可以正常工作..