Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在表Spring+;冬眠+;春季安全_Java_Spring_Hibernate_Spring Security_One To One - Fatal编程技术网

Java 如何在表Spring+;冬眠+;春季安全

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=

我想做一个例子,当用户通过Spring安全验证,然后他填写adres表单时,我想自动更新用户表中的外键列“adres_id”。请告诉我如何以最流行的方式实现这一点

我怎么会有这样的事

地址表:

用户表:

地址

@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;
    }
    ...
}