2016-05-30 17 views
2

ユーザーがSpring Securityによって認証され、adresフォームを記入したい場合、私は自動的に外部キー列 "adres_id"をユーザー内で更新したいと思います表。 Address Tableテーブルに外部キーを設定する方法

ユーザー表: User Table

ADRES私がどのようにsomethigこの

アドレステーブルのような最も一般的な方法

でこれを実装する方法をヒントを与えてください

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



} 

AdresService

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


} 

答えて

0

UserAddressオブジェクトが所有者について知っていると思わない場合(通常はそうではありません)、UserAddressの一方向の関係です。 Userに複数のID(1対多の関係)がある場合は、ユーザーIDをAddressにすることをお勧めします。

しかし、あなたの質問、あなたがそのように設計することができるため

public class User{ 
    ... 
    @OneToOne(CascadeType.REMOVE)//this is for to remove address when user is removed 
    @JoinColumn(name="HOME_ADDRESS_ID") 
    private Address address; 
    ... 
} 

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; 
    } 
    ... 
} 
+0

あなたは私を見るように私はそれを設計したが、それはまだ私の問題を解決しません。私はアドレスオブジェクトを塗りつぶすと "アドレス"テーブルにデータが読み込まれ、 "User"テーブルに外部キーHOME_ADDRESS_IDがありますが、値はありません。 "Address"テーブルの "id"と "User"テーブルの "HOME_ADDRESS_ID"の同じ値を持っています。どのようにそれを実装する? – luafanti

+0

まずアドレスを保存し、このアドレスをuser.setAddress(mySavedNewAddress)のようなユーザーのアドレスに設定すると、ユーザーのテーブルにアドレスIDが表示されます。 – ismail

+0

実際にjpaが動作した後は、アドレスオブジェクトのIDは自動的に更新されますが、この操作後に新しく作成されたアドレスにIDが設定されていることを確認してください。 – ismail

関連する問題