๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
TIL

03/08(๊ธˆ) ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ Java 52์ผ์ฐจ TIL - @OneToOne

by ๊ฐ์ž๊ฐœ๋ฐœ๊พผ 2024. 3. 8.

 

๐Ÿ“–  ์˜ค๋Š˜์˜ ํ•™์Šต ํ‚ค์›Œ๋“œ

  • @OneToOne

 

๐Ÿฅ”  @OneToOne

: @OneToOne ์• ๋„ˆํ…Œ์ด์…˜์€ 1:1 ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

: ๊ณ ๊ฐ Entity์™€ ์Œ์‹ Entity๊ฐ€ 1:1 ๊ด€๊ณ„๋ผ ๊ฐ€์ •ํ•˜์—ฌ ๊ด€๊ณ„๋ฅผ ๋งบ์–ด๋ด…๋‹ˆ๋‹ค.

 

โ—๏ธ ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„

 

- ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ ์ •ํ•˜๊ธฐ

: Entity์—์„œ ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ์€ ์ผ๋ฐ˜์ ์œผ๋กœ N์˜ ๊ด€๊ณ„์ธ Entity์ด์ง€๋งŒ 1:1 ๊ด€๊ณ„์—์„œ๋Š” ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ์„ ์ง์ ‘ ์ง€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

: ์™ธ๋ž˜ํ‚ค ์ฃผ์ธ๋งŒ์ด ์™ธ๋ž˜ํ‚ค๋ฅผ ๋“ฑ๋ก, ์ˆ˜์ • ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฃผ์ธ์ด ์•„๋‹Œ ์ชฝ์€ ์˜ค์ง ์™ธ๋ž˜ํ‚ค๋ฅผ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

: @JoinColumn()์€ ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ์ด ํ™œ์šฉํ•˜๋Š” ์• ๋„ˆํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.

- ์ปฌ๋Ÿผ๋ช…, null ์—ฌ๋ถ€, unique ์—ฌ๋ถ€ ๋“ฑ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ์Œ์‹ Entity๊ฐ€ ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ์ธ ๊ฒฝ์šฐ
// ์Œ์‹

@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @OneToOne
    @JoinColumn(name = "user_id")
    private User user;
}

// ๊ณ ๊ฐ

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

 

 

โ—๏ธ ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„

 

: ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„์—์„œ ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ์„ ์ง€์ •ํ•ด ์ค„ ๋•Œ mappedBy ์˜ต์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

: mappedBy์˜ ์†์„ฑ๊ฐ’์€ ์™ธ๋ž˜ ํ‚ค์˜ ์ฃผ์ธ์ธ ์ƒํƒœ Entity์˜ ํ•„๋“œ๋ช…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿšจ ์ฃผ์˜!

1.
- ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ์ธ Entity์—์„œ @JoinColumn() ์• ๋„ˆํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ default ์˜ต์…˜์ด ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋žต๊ฐ€๋Šฅ
- ๋‹ค๋งŒ 1:N ๊ด€๊ณ„์—์„œ ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ Entity๊ฐ€ @JoinColumn() ์• ๋„ˆํ…Œ์ด์…˜์„ ์ƒ๋žตํ•œ๋‹ค๋ฉด JPA๊ฐ€ ์™ธ๋ž˜ํ‚ค๋ฅผ
- ์ €์žฅํ•  ์ปฌ๋Ÿผ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์—†์–ด์„œ ์˜๋„ํ•˜์ง€ ์•Š์€ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
- ๋”ฐ๋ผ์„œ ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ Entity์—์„œ @JoinColumn() ์• ๋„ˆํ…Œ์ด์…˜์„ ํ™œ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

2.
- ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„์—์„œ mappedBy ์˜ต์…˜์„ ์ƒ๋žตํ•  ๊ฒฝ์šฐ JPA๊ฐ€ ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ Entity๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์—†์–ด
- ์˜๋„ํ•˜์ง€ ์•Š์€ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ˜๋“œ์‹œ ์„ค์ •ํ•ด์ฃผ๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

 

  • ์Œ์‹ Entity๊ฐ€ ์™ธ๋ž˜ํ‚ค์˜ ์ฃผ์ธ์ธ ๊ฒฝ์šฐ
// ์Œ์‹

@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @OneToOne
    @JoinColumn(name = "user_id")
    private User user;
}

// ๊ณ ๊ฐ

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToOne(mappedBy = "user")
    private Food food;
}

 

 

 

๐Ÿ“š  ์˜ค๋Š˜์˜ ํšŒ๊ณ 

JPA์˜ ๊ธฐ๋ณธ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋‹ค์‹œ ์Œ“๊ธฐ!