Java 如何在表Spring+;冬眠+;春季安全
我想做一个例子,当用户通过Spring安全验证,然后他填写adres表单时,我想自动更新用户表中的外键列“adres_id”。请告诉我如何以最流行的方式实现这一点 我怎么会有这样的事 地址表: 用户表: 地址Java 如何在表Spring+;冬眠+;春季安全,java,spring,hibernate,spring-security,one-to-one,Java,Spring,Hibernate,Spring Security,One To One,我想做一个例子,当用户通过Spring安全验证,然后他填写adres表单时,我想自动更新用户表中的外键列“adres_id”。请告诉我如何以最流行的方式实现这一点 我怎么会有这样的事 地址表: 用户表: 地址 @Entity @Table(name="adres") public class Adres { @Id @GeneratedValue(strategy = GenerationType.AUTO ) int id; @Column(name=
@Entity
@Table(name="adres")
public class Adres {
@Id
@GeneratedValue(strategy = GenerationType.AUTO )
int id;
@Column(name="country", nullable=false)
private String country;
private String street;
private String postcode;
private String telephone;
private String pesel;
@OneToOne(mappedBy ="adres")
private User user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPostcode() {
return postcode;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getPesel() {
return pesel;
}
public void setPesel(String pesel) {
this.pesel = pesel;
}
public String getStreet() {
return postcode;
}
public void setStreet(String street) {
this.street = street;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
用户
@Entity
@Table(name="users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO )
int id;
@Column(name="username", nullable=false)
private String username;
private String password;
private String email;
private Boolean enabled;
@OneToOne(cascade = CascadeType.ALL)
private Adres adres;
public Boolean getEnabled() {
return enabled;
}
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
AdresDAO
@Repository
@Transactional
public class AdresDAOImpl implements AdresDAO{
@Autowired
SessionFactory sessionFactory;
public void addAdres(Adres adres) {
sessionFactory.getCurrentSession().save(adres);
}
public List<Adres> listAdres() {
return sessionFactory.getCurrentSession().createQuery("from Adres order by id").list();
}
public void removeAdres(int id) {
Adres adres = (Adres) sessionFactory.getCurrentSession().load(
Adres.class, id);
if (null != adres) {
sessionFactory.getCurrentSession().delete(adres);
}
}
public Adres getAdres(int id) {
return (Adres)sessionFactory.getCurrentSession().get(Adres.class, id);
}
public void editAdres(Adres adres) {
sessionFactory.getCurrentSession().update(adres);
}
}
@存储库
@交易的
公共类AdresDAOImpl实现AdresDAO{
@自动连线
会话工厂会话工厂;
公共无效地址(Adres Adres){
sessionFactory.getCurrentSession().save(adres);
}
公共列表列表地址(){
返回sessionFactory.getCurrentSession().createQuery(“根据id从地址排序”).list();
}
公共无效删除(内部id){
Adres Adres=(Adres)sessionFactory.getCurrentSession().load(
地址类别,id);
如果(空!=adres){
sessionFactory.getCurrentSession().delete(adres);
}
}
公共地址GetAddress(内部id){
return(Adres)sessionFactory.getCurrentSession().get(Adres.class,id);
}
公共无效编辑地址(Adres Adres){
sessionFactory.getCurrentSession()更新(adres);
}
}
地址服务
@Service
public class AdresServiceImpl implements AdresService{
@Autowired
AdresDAO adresDAO;
@Transactional
public void addAdres(Adres adres) {
adresDAO.addAdres(adres);
}
@Transactional
public void editAdres(Adres adres) {
adresDAO.editAdres(adres);
}
@Transactional
public List<Adres> listAdres() {
return adresDAO.listAdres();
}
@Transactional
public void removeAdres(int id) {
adresDAO.removeAdres(id);
}
@Transactional
public Adres getAdres(int id) {
return adresDAO.getAdres(id);
}
}
@服务
公共类AdresServiceImpl实现AdresService{
@自动连线
AdresDAO AdresDAO;
@交易的
公共无效地址(Adres Adres){
adresDAO.ADDES(adres);
}
@交易的
公共无效编辑地址(Adres Adres){
编辑地址(adres);
}
@交易的
公共列表列表地址(){
返回adresDAO.listAdres();
}
@交易的
公共无效删除(内部id){
地址删除地址(id);
}
@交易的
公共地址GetAddress(内部id){
返回地址dao.getAdres(id);
}
}
用户
如果地址
对象不应该知道其所有者(通常它不知道),则用户
和地址
之间的单向关系。如果用户
有多个地址
(一对多关系),我更喜欢地址
表中的用户id
但是对于你的问题你可以这样设计
public class User{
...
@OneToOne(CascadeType.REMOVE)//this is for to remove address when user is removed
@JoinColumn(name="HOME_ADDRESS_ID")
private Address address;
...
}
及
我像你给我看的那样设计它,但它仍然不能解决我的问题。当我填充address对象时,它会填充一个“address”表,我的“User”表中有一个外键HOME\u address\u ID,但它没有值。我希望“地址”表中的“id”和“用户”表中的“HOME\u Address\u id”的值相同。如何实现它?因此,首先保存您的地址,然后将此地址设置为用户的地址,如user.setAddress(mySavedNewAddress),然后您将在用户表中看到地址id。实际上,在jpa完成其工作后,它将自动更新您的地址对象的id,但确保您新创建的地址在此操作后具有id。是的!非常感谢,这就是我的意思。一开始我错了,因为我认为使用JPA自动升级外键而不需要任何设置器:)很高兴听到这个消息。
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.AUTO )
int id;
@Column(name="country", nullable=false)
private String country;
private String street;
private String postcode;
private String telephone;
private String pesel;
//no user object here
public int getId() {
return id;
}
...
}