๋ชฉ์ฐจ
๊ธฐ๋ณธ๊ฐ ํ์
๋จ์ํ ๊ฐ์ผ๋ก๋ง ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ํ์ ์ด๋ ๊ฐ์ฒด์ด๋ค.
์๋ณ์๊ฐ ์๊ณ ๊ฐ๋ง ์๊ธฐ๋๋ฌธ์ ๋ณ๊ฒฝ ์ถ์ ๋ถ๊ฐ๋ฅํ๋ค.
์๋ฒ ๋๋ํ์
์ํฐํฐ์ด์ง๋ง, ๊ธฐ๋ณธ๊ฐ์ฒ๋ผ ๋จ์ํ ๊ฐ์ผ๋ก๋ง ์ฌ์ฉํ๋ ๊ฐ์ฒด์ด๋ค.
= ๋ณ๊ฒฝ ์ถ์ ๋ถ๊ฐ๋ฅํ๋ค.
@Embeddable : ๊ฐ์ ์ ์ํ๋ ๊ณณ์ ํ์
@Embedded : ๊ฐ์ ์ฌ์ฉํ๋ ๊ณณ์ ํ์
๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํ์๋ก ๋ง๋ค์ด์ฃผ์ด์ผํ๋ค.
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="member_id")
private Long id; //๊ฐ ํ์
private String name; //๊ฐ ํ์
private String city;
private String street;
private String zipcode;
}
city, street, zipcode๋ฅผ Address๋ผ๋ ์ํฐํฐ๋ก ๋ฌถ์ด๋ด์
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="member_id")
private Long id; //๊ฐ ํ์
private String name; //๊ฐ ํ์
@Embedded
private Address address; //์๋ฒ ๋๋ ํ์
}
@Embeddable
public class Address{
private String city;
private String street;
private String zipcode;
}
์๋ฒ ๋๋ ํ์ ์ผ๋ก ๋ฌถ์ด๋ด๋ ํ ์ด๋ธ ๋งคํ์ ๋๊ฐ๋ค.
์๋ฒ ๋๋ํ์ VS @MappedSuperclass
@MappedSuperclass๋ "์์"์ด๊ธฐ ๋๋ฌธ์ ๋ค์ค์์์ด ๋ถ๊ฐ๋ฅํ๋ค.
@Embedded๋ "๊ฐ"์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ํฐํฐ๋ฅผ ๋ค์ค์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="member_id")
private Long id; //๊ฐ ํ์
private String name; //๊ฐ ํ์
@Embedded
private Address homeaddress; //์๋ฒ ๋๋ ํ์
@Embedded
private Address workaddress; //์๋ฒ ๋๋ ํ์
}
@Embeddable
public class Address{
private String city;
private String street;
private String zipcode;
}
์ด๋๋ homeAddress์ workAddress์ ์ปฌ๋ผ๋ช ์ด ๊ฒน์น๊ธฐ๋๋ฌธ์
@AttributeOverrides, @AttributeOverride๋ฅผ ์ฌ์ฉํด์ ์ปฌ๋ผ๋ช ์ ์ฌ์ ์ ํด์ผํ๋ค.
@AttributeOverride
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="member_id")
private Long id; //๊ฐ ํ์
private String name; //๊ฐ ํ์
@Embedded
private Address homeaddress; //์๋ฒ ๋๋ ํ์
@Embedded
@AttributeOverrides({
@AttributeOverride(name="city", column=@Column(name="work_city")),
@AttributeOverride(name="street", column=@Column(name="work_street")),
@AttributeOverride(name="zipcode", column=@Column(name="work_zipcode"))
})
private Address workaddress; //์๋ฒ ๋๋ ํ์
}
@Embeddable
public class Address{
private String city;
private String street;
private String zipcode;
}
๊ฐํ์ ๊ณผ ๋ถ๋ณ๊ฐ์ฒด
์๋ฒ ๋๋ ํ์ ๊ฐ์ ์ฌ๋ฌ ์ํฐํฐ์์ ๊ณต์ ํ๋ฉด ์ํํ๋ค.
Address address = new Address("city", "street", "1000");
Member member1 = new Member();
member1.setName("member1");
member1.setAddress(address); //โญโญโญ
em.persist(member1);
Member member2 = new Member();
member2.setName("member2");
member2.setAddress(address); //โญโญโญ
em.persist(member2);
member1.getAddress().setCity("newCity");
System.out.println(member1.getAddress().getCity()); //newCity
System.out.println(member2.getAddress().getCity()); //newCity โโโโโ
๋ฐ๋์ ๊ฐ์ ๋ณต์ฌํด์ ์ฌ์ฉํด์ผํ๋ค!!!!!!!
๊ธฐ๋ณธํ์ ์ ๊ฐ์ ๋ณต์ฌํ์ง๋ง, ๊ฐ์ฒดํ์ ์ ์ฐธ์กฐ๋ฅผ ์ ๋ฌํ๋ค๋ ๊ฒ์ ์์ง๋ง์
Address address = new Address("city", "street", "1000");
Member member1 = new Member();
member1.setName("member1");
member1.setAddress(address); //โญโญโญ
em.persist(member1);
Address copyAddress = new Address(address.getCity(), address.getStreet(), address.getZipcode());
Member member2 = new Member();
member2.setName("member2");
member2.setAddress(copyAddress); //โญโญโญ
em.persist(member2);
member1.getAddress().setCity("newCity");
System.out.println(member1.getAddress().getCity()); //newCity
System.out.println(member2.getAddress().getCity()); //City โโโโโ
ํ์ง๋ง.. ๋๊ตฐ๊ฐ member2.setAddress(address); ๋ฅผ... ์ค์๋ก ์ ๋ ฅํ๋ฉด ์ด๋กํ์ง?!
๊ฐ์ฒดํ์ ์ ์์ ์์ ํ ์ ์๊ฒ ๋ง๋ค์ด๋ฒ๋ฆฌ๋ฉด ๋๋ค.
๋ถ๋ณ๊ฐ์ฒด : ์์ฑ ์ดํ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ๊ฐ์ฒด
์์ฑ์๋ก๋ง ๊ฐ์ ์ค์ ํ๊ณ , setter๋ฅผ ๋ง๋ค์ง ์์ผ๋ฉด ๋๋ค.
๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด, ์์ copy๋ฉ์๋๋ฅผ ๋ง๋ค์
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="member_id")
private Long id; //๊ฐ ํ์
private String name; //๊ฐ ํ์
@Embedded
private Address homeaddress; //์๋ฒ ๋๋ ํ์
...getter๋ง ์์ฑ... //โญโญโญ
public void copyAddress(){
~~~
}
}
@Embeddable
public class Address{
private String city;
private String street;
private String zipcode;
}
๊ฐํ์ ์ปฌ๋ ์
ํ์์ด ์ข์ํ๋ ์์์ ๋ฐ์ผ๋ ค๋ฉด ์ด๋ป๊ฒํ๋ฉด๋ ๊น?
Member์ List<String> foods ์ด๋ฐ์์ผ๋ก ์ถ๊ฐํ๋ฉด๋๋ค.
ํ ์ด๋ธ์์๋ ์ปฌ๋ ์ ์ ์ ์ฅํ ์ ์๊ธฐ๋๋ฌธ์ member_id์ food(varchar)๋ฅผ ๊ฐ์ง ํ ์ด๋ธ์ ํ๋ ์์ฑํด์ผํ๋ค.
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="member_id")
private Long id; //๊ฐ ํ์
private String name; //๊ฐ ํ์
@ElementCollection
@CollectionTable(name ="favorite_food",
joinColumns = @JoinColumn(name="member_id")
)
@Column(name = "food_name")
private Set<String> favoriteFoods = new HashSet<>(); //์ปฌ๋ ์
ํ์
@ElementCollection
@CollectionTable(name ="address",
joinColumns = @JoinColumn(name="member_id")
)
@Column(name = "food_name")
private List<Address> addressList = new ArrayList<>(); //์ปฌ๋ ์
ํ์
}
๊ฐํ์ ์ปฌ๋ ์ ์ ์์์ฑ ์ ์ด + ๊ณ ์ ๊ฐ์ฒด ์ ๊ฑฐ ๊ธฐ๋ฅ์ ํ์๋ก ๊ฐ์ง๋ค๊ณ ๋ณผ ์ ์๋ค.
๊ฐํ์ ์ปฌ๋ ์ ๋ ์ง์ฐ๋ก๋ฉ ์ ๋ต ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
โ ๊ฐํ์ ์ปฌ๋ ์ ์ ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์ํ๋ฉด JPA๋ ์ฃผ์ธ ์ํฐํฐ์ ์ฐ๊ด๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ณ ,
๊ฐ ํ์ ์ปฌ๋ ์ ์ ์๋ ํ์ฌ ๊ฐ์ ๋ชจ๋ ๋ค์ ์ ์ฅํ๋ค.
โ ๊ฐํ์ ์ปฌ๋ ์ ์ ๋งคํํ๋ ํ ์ด๋ธ์ ๋ชจ๋ ์ปฌ๋ผ์ ๋ฌถ์ด์ ๊ธฐ๋ณธํค๋ก ๊ตฌ์ฑํด์ผํ๋ค. ๊ทธ๋์ผ null๊ณผ ์ค๋ณต์ ์ฅ์ ๋ง์ ์ ์๋ค.
=> ๋๋๋ก ๊ฐํ์ ์ปฌ๋ ์ ๋์ ์ผ๋๋ค ๊ด๊ณ๋ก ํ์ด๋ด์
์ฐจ๋ผ๋ฆฌ ์ํฐํฐ๋ก ํ๋ฒ ๋ฉํํ์.
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="member_id")
private Long id; //๊ฐ ํ์
private String name; //๊ฐ ํ์
@ElementCollection
@CollectionTable(name ="favorite_food",
joinColumns = @JoinColumn(name="member_id")
)
@Column(name = "food_name")
private Set<String> favoriteFoods = new HashSet<>(); //์ปฌ๋ ์
ํ์
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "member_id")
private List<AddressEntity> addressList = new ArrayList<>(); //์ปฌ๋ ์
ํ์
}
@Entity
@Table(name = "address")
public class AddressEntity{
@Id @GeneratedValue
@Column(name="member_id")
private Long id; //๊ฐ ํ์
private Address address;
}
๊ฐํ์ ์ ๊ฐํ์ ์ด๋ผ ํ๋จ๋ ๋๋ง ์ฌ์ฉํ์.
์ํฐํฐ์ ๊ฐ ํ์ ์ ํผ๋ํด์ ์ํฐํฐ๋ฅผ ๊ฐ ํ์ ์ผ๋ก ๋ง๋ค๋ฉด ์๋๋ค.
์๋ณ์๊ฐ ํ์ํ๊ณ , ์ง์ํด์ ๊ฐ์ ์ถ์ ํ๊ณ ๋ณ๊ฒฝํด์ผํ๋ค๋ฉด ์ํฐํฐ์ด๋ค.
'๐พ Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ํ๋ก์์ ์ฆ์๋ก๋ฉ, ์ง์ฐ๋ก๋ฉ / ์์์ฑ ์ ์ด์ ๊ณ ์๊ฐ์ฒด (0) | 2022.02.21 |
---|---|
[JPA] ์์๊ด๊ณ ๋งคํ, ๊ณตํต ์์ฑ ๋งคํ (0) | 2022.02.21 |
[JPA] ๋ค์ํ ์ฐ๊ด๊ด๊ณ ๋งคํ(๋ค๋์ผ, ์ผ๋์ผ, ๋ค๋๋ค) (0) | 2022.02.21 |
[JPA]์์์ฑ ๊ด๋ฆฌ : ๋ด๋ถ ๋์ ๋ฐฉ์ (0) | 2022.02.21 |
[JPA] ์ฐ๊ด๊ด๊ณ ๋งคํ (0) | 2022.02.20 |