java 11
import java.util.ArrayList;
import java.util.List;
import static javax.persistence.GenerationType.SEQUENCE;
@Entity
@Table(name = "client")
public class Client {
@Id
@GeneratedValue(strategy = SEQUENCE, generator="clientId_generator")
@SequenceGenerator(name = "clientId_generator", sequenceName = "clientId", allocationSize = 1)
private Long id;
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "client", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<AddressDataSet> addresses = new ArrayList<>();
@OneToMany(mappedBy = "client", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<PhoneDataSet> phones = new ArrayList<>();
}
And this:
@Entity
@Table(name = "address_data_set")
public class AddressDataSet {
@Id
@GeneratedValue(strategy = SEQUENCE, generator="addressId_generator")
@SequenceGenerator(name = "addressId_generator", sequenceName = "addressId", allocationSize = 1)
private Long id;
@Column(name = "street")
private String street;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "client_id", nullable = false)
private Client client;
And this:
@Entity
@Table(name = "phone_data_set")
public class PhoneDataSet {
@Id
@GeneratedValue(strategy = SEQUENCE, generator="phoneId_generator")
@SequenceGenerator(name = "phoneId_generator", sequenceName = "phoneId", allocationSize = 1)
private Long id;
@Column(name = "number")
private String number;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "client_id", nullable = false)
private Client client;
Try to start:
private Main() {
var configuration = new Configuration()
.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQL10Dialect")
.setProperty("hibernate.connection.url", URL)
.setProperty("hibernate.connection.username", USER)
.setProperty("hibernate.connection.password", PASSWORD)
.setProperty("hibernate.show_sql", "true")
.setProperty("hibernate.hbm2ddl.auto", "create-drop") //validate - оптимальный вариант
.setProperty("hibernate.generate_statistics", "true");
var serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
var metadata = new MetadataSources(serviceRegistry)
.addAnnotatedClass(Client.class)
.addAnnotatedClass(AddressDataSet.class)
.addAnnotatedClass(PhoneDataSet.class)
.getMetadataBuilder()
.build();
sessionFactory = metadata.getSessionFactoryBuilder().build();
}
But I get error:
Exception in thread "main" org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags: [hw10.model.Client.addresses,.hw10.model.Client.phones]
at org.hibernate.loader.plan.exec.internal.AbstractLoadQueryDetails.generate(AbstractLoadQueryDetails.java:193)
at org.hibernate.loader.plan.exec.internal.EntityLoadQueryDetails.<init>(EntityLoadQueryDetails.java:85)
at org.hibernate.loader.plan.exec.internal.BatchingLoadQueryDetailsFactory.makeEntityLoadQueryDetails(BatchingLoadQueryDetailsFactory.java:64)
at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.<init>(AbstractLoadPlanBasedEntityLoader.java:97)