@En til en

Ledig

5.1 Forskellige former for en-til-en kommunikation

Der er et andet interessant og ret specifikt tilfælde af et forhold mellem to Entity-klasser - et en-til-en forhold.

Jeg kalder dette tilfælde meget specifikt, da det handler mere om Java-objekter end om en database. I databasen er der kun to muligheder for forholdet mellem tabeller:

  • Tabelrækken indeholder et link til id'et for en anden tabel.
  • Servicetabellen bruges til mange-til-mange relationer.

I tilfælde af enhedsklasser kan der være muligheder, der er beskrevet med flere annotationer:

  • @Indlejret
  • Ensidig OneToOne
  • Bilateral OneToOne
  • @MapsId

Nedenfor vil vi overveje de mest populære af dem.

5.2 Indlejret

Forresten har vi allerede overvejet den enkleste en-til-en@Embedded kommunikationsmulighed - dette er en anmærkning . I dette tilfælde har vi to klasser gemt i den samme tabel i databasen.

Lad os sige, at vi vil gemme brugerens adresse i klassen UserAddress :

@Embeddable
class UserAddress {
   @Column(name="user_address_country")
   public String country;
   @Column(name="user_address_city")
   public String city;
   @Column(name="user_address_street")
   public String street;
   @Column(name="user_address_home")
   public String home;
}

Så skal vi bare tilføje et felt med denne adresse til brugerklassen :

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

   @Embedded
   public UserAddress address;

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

Hibernate klarer resten: dataene vil blive gemt i én tabel, men når du skriver HQL-forespørgsler, skal du arbejde på klassefelter.

Eksempel på HQL-forespørgsel:

select from User where address.city = 'Paris'

5.3 Ensidet OneToOne

Forestil dig nu situationen: Vi har en kildetabelmedarbejder og en opgave, der refererer til medarbejder. Men vi ved med sikkerhed, at der maksimalt kan tildeles én opgave til én bruger. Så kan vi bruge annotationen til at beskrive denne situation @OneToOne.

Eksempel:

@Entity
@Table(name="task")
class EmployeeTask {
   @Column(name="id")
   public Integer id;

   @Column(name="name")
   public String description;

   @OneToOne
   @JoinColumn(name = "employee_id")
   public Employee employee;

   @Column(name="deadline")
   public Date deadline;
}

Hibernate sørger for, at ikke kun én opgave har én bruger, men også at én bruger kun har én opgave. Ellers er denne sag praktisk talt ikke anderledes end @ManyToOne.

5.4 Bilateral OneToOne

Den tidligere mulighed kan være lidt ubelejlig, fordi du ofte vil tildele en medarbejder ikke kun til en opgave, men også tildele en opgave til en medarbejder.

For at gøre dette kan du tilføje EmployeeTask-feltet til Employee-klassen og give den de korrekte anmærkninger.

@Entity
@Table(name="employee")
class Employee {
   @Column(name="id")
   public Integer id;

   @OneToOne(cascade = CascadeType.ALL, mappedBy="employee")
   private EmployeeTask task;
}

Vigtig!Medarbejdertabellen har ikke et opgave_id - felt , i stedet bruges feltet medarbejder_id i opgavetabellen til at etablere en relation mellem tabeller .

Etablering af en forbindelse mellem objekter ser sådan ud:

Employee director = session.find(Employee.class, 4);
EmployeeTask task = session.find(EmployeeTask.class, 101);
task.employee = director;
director.task = task;

session.update(task);
session.flush();

For at fjerne linket skal linkene også fjernes fra begge objekter:

Employee director = session.find(Employee.class, 4);
EmployeeTask task = director.task;

task.employee = null;
session.update(task);

director.task = null;
session.update(director);

session.flush();
Kommentarer
  • Populær
  • Ny
  • Gammel
Du skal være logget ind for at skrive en kommentar
Denne side har ingen kommentarer endnu