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