@Id ์ฃผ์„

Hibernate์˜ ๊ฐ Entity ์—”ํ„ฐํ‹ฐ๋Š” ๊ธฐ๋ณธ ํ‚ค๊ฐ€ ๋  ํ•„๋“œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์—๋Š” ์ด ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ฐœ์ฒด์— ๋Œ€ํ•œ ๊ณ ์œ ํ•œ ๊ฐ’์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ํ•„๋“œ์—๋Š” @Id ์ฃผ์„์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค .

์ผ๋ฐ˜ ํ˜•์‹:

@Id
Class Name;

์˜ˆ:

@Entity
@Table(name="user")
class User
{
   @Id
   @Column(name="id")
   public Integer id;

   @Embedded
   public UserAddress address;

   @Column(name="created_date")
   public Date createdDate;
}

์ฃผ์„ ๋ฐฐ์น˜

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ํ•„๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฉ”์†Œ๋“œ(๊ฒŒํ„ฐ ๋˜๋Š” ์„ธํ„ฐ)์— ๋Œ€ํ•ด์„œ๋„ @Column ์ฃผ์„์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

@Entity
@Table(name="user")
class User
{
    public Integer id;
    public Date createdDate;

   @Id
   @Column(name="id")
   public Integer getId() {
   	return this.id;
   }
   public void setId(Integer id)    {
  	this.id = id;
   }

   @Column(name="created_date")
   public Date getDate() {
  	return this.createdDate;
   }
   public void setCreatedDate(Date date) {
      this. createdDate = date;
   }
}

์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ฃผ์„์ด ํด๋ž˜์Šค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ์ถ”๊ฐ€๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ํด๋ž˜์Šค ํ•„๋“œ๊ฐ€ ์—†์ง€๋งŒ getter ๋ฐ setter ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Hibernate๋Š” ์ด ๋‘ ํ‘œ์ค€์„ ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”ํ•œ! ํด๋ž˜์Šค์— @Entity ์ฃผ์„์ด ์žˆ์œผ๋ฉด ๋ชจ๋“  ํ•„๋“œ๊ฐ€ Hibernate์— ์˜ํ•ด ์˜์† ํ•„๋“œ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค( @Transient ์ฃผ์„์ด ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ). ํ•„๋“œ์— ์ฃผ์„์ด ์ „ํ˜€ ์—†๋Š” ๊ฒฝ์šฐ์—๋„: ์ด ๊ฒฝ์šฐ ์—ด ์ด๋ฆ„์€ ํด๋ž˜์Šค ํ•„๋“œ ์ด๋ฆ„๊ณผ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ @Id ์ฃผ์„์ด ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์„์ด ํด๋ž˜์Šค ํ•„๋“œ์— ๋ฐฐ์น˜๋˜๋ฉด Hibernate๋Š” ํ•„๋“œ์˜ ์ด๋ฆ„๊ณผ ์œ ํ˜•์„ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. @Id ์ฃผ์„์ด ๋ฉ”์†Œ๋“œ์— ๋ฐฐ์น˜ ๋˜๋ฉด Hibernate๋Š” ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„๊ณผ ์œ ํ˜•์„ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ 1:

@Entity
@Table(name="user")
class User
{
   @Id
    public Integer id;
    public Date createdDate;  //this field will be treated as if it had @Column(name=" createdDate ")

}

์˜ˆ 2:

@Entity
@Table(name="user")
class User
{
    public Integer id;
    public Date createdDate;

   @Id
   public Integer getId() {
   	return this.id;
   }
   public void setId(Integer id)    {
  	this.id = id;
   }

   public Date getDate() { //this field will be treated as if it had @Column(name=โ€date โ€)
  	return this.createdDate;
   }
   public void setCreatedDate(Date date) {
  	this. createdDate = date;
   }

}

@GeneratedValue ์ฃผ์„

์ƒˆ ๊ฐœ์ฒด์— ID๋ฅผ ์ง์ ‘ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ Hibernate์˜ ์ž๋น„์— ๋งก๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Hibernate๊ฐ€ ๊ฐ์ฒด์— ID๋ฅผ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํ•œ ์ฃผ์„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@GeneratedValue

์ด ์ฃผ์„์€ ์ผ๋ฐ˜์ ์œผ๋กœ @Id ์ฃผ์„ ๊ณผ ๋™์ผํ•œ ํ•„๋“œ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค . ๊ทธ๋…€๋Š” 4๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ID ํ• ๋‹น ์ „๋žต์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ž๋™
  • ์‹ ์›
  • ์ˆœ์„œ
  • ํ…Œ์ด๋ธ”

์ง€์ •๋œ ์ „๋žต์ด ์žˆ๋Š” ์ฃผ์„์˜ ์˜ˆ:

@Entity
@Table(name="user")
class User
{
    @Id
	@GeneratedValue(strategy = GenerationType.AUTO)
    public Integer id;

    public Date createdDate;
}

์ •์ฑ… ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด AUTO ์ „๋žต์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. AUTO ์ „๋žต์€ Hibernate๊ฐ€ ์ฃผ๋กœ ID ํ•„๋“œ์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ID ์ž์ฒด๋ฅผ ํ• ๋‹นํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์™œ ์œ ํ˜•์—? ์˜ˆ, ID ์œ ํ˜•์€ ๋ฌธ์ž์—ด ๋˜๋Š” GUID์™€ ๊ฐ™์ด ๋งค์šฐ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ:

@Entity
@Table(name="user")
class User
{
    @Id
	@GeneratedValue
    public UUID id;

    public Date createdDate;
}

์ฐธ๊ณ : Java์˜ GUID๋Š” ์ „ํ†ต์ ์œผ๋กœ UUID๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Hibernate๋Š” ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ๊ณ ์œ ํ•œ UUID๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ @GeneratedValue ์ „๋žต

GeneratedValue(strategy = GenerationType.IDENTITY) ์œ ํ˜•์„ ์ง€์ •ํ•˜๋ฉด Hibernate๋Š” ID ์„ค์ •์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณ„์ธต์— ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ PRIMARY KEY, AUTOINCREMENT๋ผ๋Š” ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ์—ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ID๊ฐ€ ๊ณ ์œ ํ•˜๊ณ  ํŠน๋ณ„ํžˆ ์ง€์ •๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ผ ์ƒ์„ฑ๋˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ GeneratedValue(strategy = GenerationType.SEQUENCE) ์ฃผ์„ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@Entity
@Table(name="user")
public class User {
	@Id
	@GeneratedValue(generator = "sequence-generator")
	@GenericGenerator(
  	name = "sequence-generator",
  	strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
  	parameters = {
    	@Parameter(name = "sequence_name", value = "user_sequence"),
    	@Parameter(name = "initial_value", value = "4"),
    	@Parameter(name = "increment_size", value = "1")
    	}
	)
	private long userId;

	// ...
}

ID๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋” ๋งŽ์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๋Ÿฌ ์—ด๋กœ ๊ตฌ์„ฑ๋œ ๋ณตํ•ฉ ๊ณ ์œ  ํ‚ค๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ฐœ์ฒด๋ฅผ ์“ธ ๋•Œ ์ด๋Ÿฌํ•œ ์—ด์„ ๋ชจ๋‘ ์ฑ„์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์šฐ๋ฆฌ ๊ฐ•์˜์˜ ๋ชฉ์ ์€ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋‹ค์‹œ ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Hibernate์— ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.