2025-01-30
| Source | |
| Branch |
|
| Java |
|
| Docker |
|
@Embeddable pour intégrer ses propriétés dans une autre entité@Getter
@Setter
@ToString
@RequiredArgsConstructor(staticName = "of")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "CUSTOMER", schema = "ex_biography")
public class Customer {
@Id
@GeneratedValue
private long id;
@Column(length = 50, nullable = false)
@NonNull
private String name;
@Embedded
@Column()
private Biography biography;
}Customer.java
import fr.univtln.bruno.demos.jpa.hello.samples.ex_biography.Customer;
try (EntityManager entityManager = emf.createEntityManager()) {
entityManager.getTransaction().begin();
Customer customer = Customer.of("Jim");
customer.setBiography(Biography.builder()
.brief("bla")
.extended("bla bla")
.build());
entityManager.persist(customer);
entityManager.getTransaction().commit();
}dans une seule relation
| id | name | bio_brief | bio_extended |
|---|---|---|---|
| 1 | Jim | bla | 70666 |
@Getter
@Setter
@ToString
@NoArgsConstructor
@Builder
@AllArgsConstructor
@Entity
@Table(name = "EORDER", schema = "EX_ONE_TO_MANY_B")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
@Builder.Default
@Column(nullable = false)
private LocalDateTime date = LocalDateTime.now();
@ElementCollection
@CollectionTable(name = "LINE", schema = "EX_ONE_TO_MANY_B")
@Singular
private Set<Line> lines = new HashSet<>();
}Collection<T> est annoté avec @OneToMany.T) est annotée avec @ManyToOne.mappedBy indique le nom de l’attribut correspondant dans le type T si l’on souhaite une relation bidirectionnelle.@Getter
@Setter
@ToString
@NoArgsConstructor
@Entity
@Table(name = "EORDER", schema = "EX_ONE_TO_MANY_A")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
private LocalDateTime date = LocalDateTime.now();
@OneToMany(mappedBy = "order",
cascade = {CascadeType.PERSIST,
CascadeType.REMOVE},
orphanRemoval = true)
@ToString.Exclude
private Set<Line> lines = new HashSet<>();
public Order addLine(Line line) {
line.setOrder(this);
lines.add(line);
return this;
}
public Order removeLine(Line line) {
line.setOrder(null);
lines.remove(line);
return this;
}
}@Getter
@Setter
@ToString
@RequiredArgsConstructor(staticName = "of")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "LINE", schema = "EX_ONE_TO_MANY_A")
public class Line {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
@NonNull
private String product;
@NonNull // just for requiredargsconstructor
private double price;
@ManyToOne
@JoinColumn(nullable = false)
@ToString.Exclude
private Order order;
public void setOrder(Order order) {
if (this.order != null) {
this.order.getLines().remove(this);
}
this.order = order;
if (order != null) {
order.getLines().add(this);
}
}
}Figure 7: Les relations LINE et EORDER
| order_id | order_date | line_id | product | price |
|---|---|---|---|---|
| 1 | 2025-01-30T18:10:25.293Z | 1 | Scissor | 8 |
| 1 | 2025-01-30T18:10:25.293Z | 2 | Pen | 1 |
| 1 | 2025-01-30T18:10:25.293Z | 3 | Paper | 5 |
| 2 | 2025-01-30T18:10:25.302Z | 4 | Moto | 8000 |
| 2 | 2025-01-30T18:10:25.302Z | 5 | Car | 20000 |
@Getter
@Setter
@ToString
@RequiredArgsConstructor(staticName = "of")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "CUSTOMER", schema = "EX_MANY_TO_MANY")
public class Customer {
@Id
@GeneratedValue
private long id;
@NonNull
private String name;
@ManyToMany
@ToString.Exclude
@JoinTable(schema = "EX_MANY_TO_MANY")
private Set<Address> places = new HashSet<>();
public void addPlace(Address address) {
this.places.add(address);
address.getOccupants().add(this);
}
public void removePlace(Address address) {
this.places.remove(address);
address.getOccupants().remove(this);
}
}@Getter
@Setter
@ToString
@RequiredArgsConstructor(staticName = "of")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "ADDRESS", schema = "EX_MANY_TO_MANY")
public class Address {
@Id
@GeneratedValue
private long id;
@NonNull
private String addressDetail;
@ManyToMany(mappedBy = "places")
@ToString.Exclude
private Set<Customer> occupants= new HashSet<>();
public void addOccupant(Customer customer) {
this.occupants.add(customer);
customer.getPlaces().add(this);
}
public void removeOccupant(Customer customer) {
this.occupants.remove(customer);
customer.getPlaces().remove(this);
}
}| id | name |
|---|---|
| 2 | Miss Hans Hagenes |
| 3 | Quinn Keeling DVM |
| 4 | Reva Welch |
| 5 | Kathy Hackett |
| 6 | Maxine Vandervort |
| occupants_id | places_id |
|---|---|
| 2 | 1 |
| 3 | 1 |
| 5 | 1 |
| 6 | 1 |
| 2 | 2 |
| 4 | 2 |
| 5 | 2 |
| id | addressdetail |
|---|---|
| 1 | Suite 304 71024 Deckow Park, Lehnermouth, AK 76082 |
| 2 | Apt. 432 8182 Linwood Parkways, Tovaville, HI 56620 |
E. Bruno - Les associations entre entités avec JPA