【发布时间】:2013-05-01 03:44:12
【问题描述】:
根据 Spring 文档,如果您需要通过数据库管理 Spring 安全性,您应该有一些标准的表模式。例如。
create table users(
username varchar(256) not null primary key,
password varchar(256) not null,
enabled boolean not null
);
create table authorities (
username varchar(256) not null,
authority varchar(256) not null,
constraint fk_authorities_users foreign key(username) references users(username)
);
create unique index ix_auth_username on authorities (username,authority);
我面临的问题如下。 1) 无法理解如何使用 JPA 实现这种表模式?
我尝试了以下方法。
@Entity
@Table(name="USERS")
public class UsersPersistence extends Users implements Serializable{
private static final long serialVersionUID = 1009548075747154488L;
public UsersPersistence() {
super();
}
public UsersPersistence(long id, String userName, String password, boolean enabled) {
super(id, userName,password,enabled);
}
@Id
@GeneratedValue
@Column(name="id")
@Override
public long getId() {
return super.getId();
}
@Column(name="username", nullable=false)
@Override
public String getUserName() {
return super.getUserName();
}
@Column(name="password", nullable=false)
@Override
public String getPassword() {
return super.getPassword();
}
@Column(name="enabled", nullable=false)
@Override
public boolean isEnabled() {
return super.isEnabled();
}
}
此表根据 Spring 文档架构中所述的要求创建。 理解的问题是当我试图在权限表中的用户名上分配外键时。由于 JPA 通过父表(主键表)的 id 分配外键,或者我可能不知道如何分配它。
以下是产生问题的 JPA 类:-
@Entity
@Table(name="AUTHORITIES")
public class AuthoritiesPersistence extends Authorities implements Serializable{
private static final long serialVersionUID = 1L;
public AuthoritiesPersistence() {
super();
}
public AuthoritiesPersistence(long id, UsersPersistence userName, String authority) {
super(id,userName,authority);
}
@Id
@GeneratedValue
@Column(name="id")
@Override
public long getId() {
return super.getId();
}
@Override
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="username", nullable=false)
public UsersPersistence getUserName() {
return (UsersPersistence) super.getUserName();
}
@Column(name="authority", nullable=false)
@Override
public String getAuthority() {
return super.getAuthority();
}
}
此表创建成功,但 Spring 安全认证无法识别用户名,因为 JPA 使用外键 id 而不是实际用户名。
任何帮助都将不胜感激。我真的被困在创建一个基于用户名而不是 id 的外键。 谢谢
【问题讨论】:
-
您的表中没有指定 id。
-
首先感谢您的快速回复@Kelvin。两个表中都指定了 ID。两个持久性类都扩展了一些父类。这些类有 id 并且在持久性类中我只是覆盖那些 getter 并将它们分配为 table id 列。
-
但是 ddl 没有提到 id 列
-
绝对正确。 DDL 没有提到 id 列。那就是问题所在。如果没有 id,我如何分配外键。 JPA 中是否可以根据 DDL 分配这样的外键?或者我没有其他选择,只能手动创建表模式并使用 JDBC dao 而不是 JPA Dao 类?
标签: spring hibernate jpa spring-mvc spring-security