diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0e3deff --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +docs/appends/JPA_Before_Annotatons:_one-to-many-xml.md +db/apartmentpredictordb.mv.db.mv.db +db/apartmentpredictordb.mv.db.mv.db diff --git a/ApartmentPredictor/src/main/java/com/example/apartment_predictor/ApartmentPredictorApplication.java b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/ApartmentPredictorApplication.java index f47eb99..c6ed997 100644 --- a/ApartmentPredictor/src/main/java/com/example/apartment_predictor/ApartmentPredictorApplication.java +++ b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/ApartmentPredictorApplication.java @@ -34,7 +34,7 @@ public void run(String... args) throws Exception { public void testApartmentsInsert() { System.out.println("Creating apartment objects and saving to db..."); // Create apartment objects based on your sample data - Apartment apartment1 = new Apartment( + /*Apartment apartment1 = new Apartment( 13300000L, // price 7420, // area 4, // bedrooms @@ -48,10 +48,10 @@ public void testApartmentsInsert() { 2, // parking "yes", // prefarea "furnished" // furnishingstatus - ); + );*/ // Create additional sample apartments - Apartment apartment2 = new Apartment( + /*Apartment apartment2 = new Apartment( 8500000L, // price 5200, // area 3, // bedrooms @@ -106,7 +106,7 @@ public void testApartmentsInsert() { System.out.println(apartment); } - //apartmentRepository.findAll().forEach(System.out::println); + //apartmentRepository.findAll().forEach(System.out::println);*/ } public void testReviewsInsert() { diff --git a/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/Apartment.java b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/Apartment.java index 53b4621..76c4ec8 100644 --- a/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/Apartment.java +++ b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/Apartment.java @@ -7,208 +7,52 @@ import java.util.UUID; @Entity -public class Apartment { +public class Apartment extends ResidentialProperty { @Id - private String id; - private Long price; - private Integer area; - private Integer bedrooms; - private Integer bathrooms; - private Integer stories; - private String mainroad; - private String guestroom; - private String basement; - private String hotwaterheating; - private String airconditioning; - private Integer parking; - private String prefarea; - private String furnishingstatus; - - @OneToMany( - mappedBy = "apartment", - cascade = CascadeType.ALL, - fetch = FetchType.EAGER) - private List reviews = new ArrayList<>(); - - // Default constructor - public Apartment() { - this.id = UUID.randomUUID().toString(); - } + private int floorLevel; + private boolean hasBalcony; // Constructor with all fields - public Apartment(Long price, Integer area, Integer bedrooms, Integer bathrooms, - Integer stories, String mainroad, String guestroom, String basement, - String hotwaterheating, String airconditioning, - Integer parking, String prefarea, String furnishingstatus) { - this.id = UUID.randomUUID().toString(); - this.price = price; - this.area = area; - this.bedrooms = bedrooms; - this.bathrooms = bathrooms; - this.stories = stories; - this.mainroad = mainroad; - this.guestroom = guestroom; - this.basement = basement; - this.hotwaterheating = hotwaterheating; - this.airconditioning = airconditioning; - this.parking = parking; - this.prefarea = prefarea; - this.furnishingstatus = furnishingstatus; - } - - // helpers - - public void addReview(Review review) { - reviews.add(review); - review.setApartment(this); - } - - public void removeReview(Review review) { - reviews.remove(review); - review.setApartment(null); - } - - - // Getters and Setters - public Long getPrice() { - return price; - } - - public void setPrice(Long price) { - this.price = price; - } - - public Integer getArea() { - return area; - } - - public void setArea(Integer area) { - this.area = area; - } - - public Integer getBedrooms() { - return bedrooms; - } - - public void setBedrooms(Integer bedrooms) { - this.bedrooms = bedrooms; - } - - public Integer getBathrooms() { - return bathrooms; - } - - public void setBathrooms(Integer bathrooms) { - this.bathrooms = bathrooms; - } - - public Integer getStories() { - return stories; - } - public void setStories(Integer stories) { - this.stories = stories; + public Apartment(double area, String address, int locationRating, int numberOfBedrooms, int numberOfBathrooms, boolean hasGarden, boolean hasBalcony, int floorLevel) { + super(area, address, locationRating, numberOfBedrooms, numberOfBathrooms, hasGarden); + this.hasBalcony = hasBalcony; + this.floorLevel = floorLevel; } - public String getMainroad() { - return mainroad; - } - - public void setMainroad(String mainroad) { - this.mainroad = mainroad; - } - - public String getGuestroom() { - return guestroom; - } - - public void setGuestroom(String guestroom) { - this.guestroom = guestroom; - } - - public String getBasement() { - return basement; - } - - public void setBasement(String basement) { - this.basement = basement; - } - - public String getHotwaterheating() { - return hotwaterheating; - } - - public void setHotwaterheating(String hotwaterheating) { - this.hotwaterheating = hotwaterheating; - } - - public String getAirconditioning() { - return airconditioning; - } - - public void setAirconditioning(String airconditioning) { - this.airconditioning = airconditioning; - } - - public Integer getParking() { - return parking; + public Apartment() { + super(); } - public void setParking(Integer parking) { - this.parking = parking; - } - public String getPrefarea() { - return prefarea; - } + // helpers - public void setPrefarea(String prefarea) { - this.prefarea = prefarea; - } - public String getFurnishingstatus() { - return furnishingstatus; + // Getters and Setters + public int getFloorLevel() { + return floorLevel; } - public void setFurnishingstatus(String furnishingstatus) { - this.furnishingstatus = furnishingstatus; + public void setFloorLevel(int floorLevel) { + this.floorLevel = floorLevel; } - public String getId() { - return id; + public boolean hasBalcony() { + return hasBalcony; } - /*public void setId(String id) { - this.id = id; - }*/ - - public List getReviews() { - return reviews; + public void setHasBalcony(boolean hasBalcony) { + this.hasBalcony = hasBalcony; } - public void setReviews(List reviews) { - this.reviews = reviews; + @Override + public double calculatePrice() { + return 750; } @Override - public String toString() { - return "Apartment{" + - "id=" + id + - ", price=" + price + - ", area=" + area + - ", bedrooms=" + bedrooms + - ", bathrooms=" + bathrooms + - ", stories=" + stories + - ", mainroad='" + mainroad + '\'' + - ", guestroom='" + guestroom + '\'' + - ", basement='" + basement + '\'' + - ", hotwater='" + hotwaterheating + '\'' + - ", airconditioning='" + airconditioning + '\'' + - ", parking=" + parking + - ", prefarea='" + prefarea + '\'' + - ", furnishingstatus='" + furnishingstatus + '\'' + - ", reviews='" + reviews.size() + '\'' + - '}'; + public boolean requiresHomeownersAssociation() { + return false; } } diff --git a/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/Duplex.java b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/Duplex.java new file mode 100644 index 0000000..04badc7 --- /dev/null +++ b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/Duplex.java @@ -0,0 +1,35 @@ +package com.example.apartment_predictor.model; + +public class Duplex extends SingleFamilyHome { + + private boolean hasSeparateUtilities; + private int units; + + public Duplex(double area, String address, int locationRating, int numberOfBedrooms, int numberOfBathrooms, boolean hasGarden, double lotSize, boolean hasGarage, boolean hasPool, boolean appropiateForPets, boolean appropiateForChildren, double hoaMonthlyFee, boolean hasSeparateUtilities) { + super(area, address, locationRating, numberOfBedrooms, numberOfBathrooms, hasGarden, lotSize, hasGarage, hasPool, appropiateForPets, appropiateForChildren, hoaMonthlyFee); + this.hasSeparateUtilities = hasSeparateUtilities; + this.units = 2; + } + + public boolean isHasSeparateUtilities() { + return hasSeparateUtilities; + } + + public void setHasSeparateUtilities(boolean hasSeparateUtilities) { + this.hasSeparateUtilities = hasSeparateUtilities; + } + + public int getUnits() { + return units; + } + + @Override + public double calculatePrice() { + return numberOfBedrooms * 200 + hoaMonthlyFee; + } + + @Override + public boolean requiresHomeownersAssociation() { + return appropiateForChildren || appropiateForPets || calculatePrice() < 1000 || area < 50; + } +} diff --git a/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/House.java b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/House.java new file mode 100644 index 0000000..1854676 --- /dev/null +++ b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/House.java @@ -0,0 +1,39 @@ +package com.example.apartment_predictor.model; + +public class House extends SingleFamilyHome{ + + private boolean hasBasement; + private double basementArea; + + public House(double area, String address, int locationRating, int numberOfBedrooms, int numberOfBathrooms, boolean hasGarden, double lotSize, boolean hasGarage, boolean hasPool, boolean appropiateForPets, boolean appropiateForChildren, double hoaMonthlyFee, boolean hasBasement, double basementArea) { + super(area, address, locationRating, numberOfBedrooms, numberOfBathrooms, hasGarden, lotSize, hasGarage, hasPool, appropiateForPets, appropiateForChildren, hoaMonthlyFee); + this.hasBasement = hasBasement; + this.basementArea = basementArea; + } + + public boolean isHasBasement() { + return hasBasement; + } + + public void setHasBasement(boolean hasBasement) { + this.hasBasement = hasBasement; + } + + public double getBasementArea() { + return basementArea; + } + + public void setBasementArea(double basementArea) { + this.basementArea = basementArea; + } + + @Override + public double calculatePrice() { + return numberOfBedrooms * 125 + hoaMonthlyFee + basementArea * 2; + } + + @Override + public boolean requiresHomeownersAssociation() { + return appropiateForChildren || appropiateForPets || calculatePrice() < 1000 || area < 50 || basementArea > 20; + } +} diff --git a/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/Property.java b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/Property.java new file mode 100644 index 0000000..61545df --- /dev/null +++ b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/Property.java @@ -0,0 +1,52 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ + +package com.example.apartment_predictor.model; + +/** + * + * @author Alumne_mati1 + */ +abstract public class Property { + protected double area; + protected String address; + protected int locationRating; + + public Property(double area, String address, int locationRating) { + this.area = area; + this.address = address; + this.locationRating = locationRating; + } + + public Property() { + + } + + public double getArea() { + return area; + } + + public void setArea(double area) { + this.area = area; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public int getLocationRating() { + return locationRating; + } + + public void setLocationRating(int locationRating) { + this.locationRating = locationRating; + } + + abstract public double calculatePrice(); +} diff --git a/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/ResidentialProperty.java b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/ResidentialProperty.java new file mode 100644 index 0000000..1b28105 --- /dev/null +++ b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/ResidentialProperty.java @@ -0,0 +1,53 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ + +package com.example.apartment_predictor.model; + +/** + * + * @author Alumne_mati1 + */ +abstract public class ResidentialProperty extends Property { + protected int numberOfBedrooms; + protected int numberOfBathrooms; + protected boolean hasGarden; + + public ResidentialProperty(double area, String address, int locationRating, int numberOfBedrooms, int numberOfBathrooms, boolean hasGarden) { + super(area, address, locationRating); + this.numberOfBedrooms = numberOfBedrooms; + this.numberOfBathrooms = numberOfBathrooms; + this.hasGarden = hasGarden; + } + + public ResidentialProperty() { + super(); + } + + public int getNumberOfBedrooms() { + return numberOfBedrooms; + } + + public void setNumberOfBedrooms(int numberOfBedrooms) { + this.numberOfBedrooms = numberOfBedrooms; + } + + public int getNumberOfBathrooms() { + return numberOfBathrooms; + } + + public void setNumberOfBathrooms(int numberOfBathrooms) { + this.numberOfBathrooms = numberOfBathrooms; + } + + public boolean isHasGarden() { + return hasGarden; + } + + public void setHasGarden(boolean hasGarden) { + this.hasGarden = hasGarden; + } + + abstract public boolean requiresHomeownersAssociation(); +} diff --git a/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/SingleFamilyHome.java b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/SingleFamilyHome.java new file mode 100644 index 0000000..86a365f --- /dev/null +++ b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/SingleFamilyHome.java @@ -0,0 +1,73 @@ +package com.example.apartment_predictor.model; + +abstract public class SingleFamilyHome extends ResidentialProperty{ + protected double lotSize; + protected boolean hasGarage; + protected boolean hasPool; + protected boolean appropiateForPets; + protected boolean appropiateForChildren; + protected double hoaMonthlyFee; + + public SingleFamilyHome(double area, String address, int locationRating, int numberOfBedrooms, int numberOfBathrooms, boolean hasGarden, double lotSize, boolean hasGarage, boolean hasPool, boolean appropiateForPets, boolean appropiateForChildren, double hoaMonthlyFee) { + super(area, address, locationRating, numberOfBedrooms, numberOfBathrooms, hasGarden); + this.lotSize = lotSize; + this.hasGarage = hasGarage; + this.hasPool = hasPool; + this.appropiateForPets = appropiateForPets; + this.appropiateForChildren = appropiateForChildren; + this.hoaMonthlyFee = hoaMonthlyFee; + } + + public double getLotSize() { + return lotSize; + } + + public void setLotSize(double lotSize) { + this.lotSize = lotSize; + } + + public boolean hasGarage() { + return hasGarage; + } + + public void setHasGarage(boolean hasGarage) { + this.hasGarage = hasGarage; + } + + public boolean isHasPool() { + return hasPool; + } + + public void setHasPool(boolean hasPool) { + this.hasPool = hasPool; + } + + public boolean isAppropiateForPets() { + return appropiateForPets; + } + + public void setAppropiateForPets(boolean appropiateForPets) { + this.appropiateForPets = appropiateForPets; + } + + public boolean isAppropiateForChildren() { + return appropiateForChildren; + } + + public void setAppropiateForChildren(boolean appropiateForChildren) { + this.appropiateForChildren = appropiateForChildren; + } + + public double getHoaMonthlyFee() { + return hoaMonthlyFee; + } + + public void setHoaMonthlyFee(double hoaMonthlyFee) { + this.hoaMonthlyFee = hoaMonthlyFee; + } + + @Override + public boolean requiresHomeownersAssociation() { + return false; + } +} diff --git a/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/Townhouse.java b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/Townhouse.java new file mode 100644 index 0000000..505d478 --- /dev/null +++ b/ApartmentPredictor/src/main/java/com/example/apartment_predictor/model/Townhouse.java @@ -0,0 +1,29 @@ +package com.example.apartment_predictor.model; + +public class Townhouse extends SingleFamilyHome{ + + private boolean hasHOA; + + public Townhouse(double area, String address, int locationRating, int numberOfBedrooms, int numberOfBathrooms, boolean hasGarden, double lotSize, boolean hasGarage, boolean hasPool, boolean appropiateForPets, boolean appropiateForChildren, double hoaMonthlyFee, boolean hasHOA) { + super(area, address, locationRating, numberOfBedrooms, numberOfBathrooms, hasGarden, lotSize, hasGarage, hasPool, appropiateForPets, appropiateForChildren, hoaMonthlyFee); + this.hasHOA = hasHOA; + } + + public boolean hasHOA() { + return hasHOA; + } + + public void setHasHOA(boolean hasHOA) { + this.hasHOA = hasHOA; + } + + @Override + public double calculatePrice() { + return numberOfBedrooms * 150 + hoaMonthlyFee; + } + + @Override + public boolean requiresHomeownersAssociation() { + return hasHOA; + } +} diff --git a/ApartmentPredictor/src/main/resources/application.properties b/ApartmentPredictor/src/main/resources/application.properties index a411229..1d378de 100644 --- a/ApartmentPredictor/src/main/resources/application.properties +++ b/ApartmentPredictor/src/main/resources/application.properties @@ -1,7 +1,7 @@ spring.application.name=ApartmentPredictor -spring.datasource.url=jdbc:h2:/home/albert/MyProjects/Sandbox/ApartmentPredictorProject/db/apartmentpredictordb +spring.datasource.url=jdbc:h2:file:C:/Users/Alumne_mati1/Desktop/JAVA/ApartmentPredictor/db/apartmentpredictordb.mv.db spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=albert spring.datasource.password=1234 diff --git a/ApartmentPredictor/src/test/java/com/example/apartment_predictor/ApartmentPredictorApplicationTests.java b/ApartmentPredictor/src/test/java/com/example/apartment_predictor/ApartmentPredictorApplicationTests.java index b2b523a..b9a1a34 100644 --- a/ApartmentPredictor/src/test/java/com/example/apartment_predictor/ApartmentPredictorApplicationTests.java +++ b/ApartmentPredictor/src/test/java/com/example/apartment_predictor/ApartmentPredictorApplicationTests.java @@ -1,7 +1,6 @@ package com.example.apartment_predictor; -import com.example.apartment_predictor.model.Apartment; -import com.example.apartment_predictor.model.Review; +import com.example.apartment_predictor.model.*; import com.example.apartment_predictor.repository.ApartmentRepository; import com.example.apartment_predictor.repository.ReviewRepository; import com.example.apartment_predictor.utils.PrintingUtils; @@ -10,6 +9,7 @@ import org.springframework.boot.test.context.SpringBootTest; import java.time.LocalDate; +import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -29,7 +29,7 @@ void testApartmentsInsert() { Apartment apartment1 = new Apartment(); apartment1.setArea(5); - apartment1.setAirconditioning("yes"); + //apartment1.setAirconditioning("yes"); // .... apartmentRepository.save(apartment1); System.out.println("Apartment saved: " + apartment1); @@ -69,7 +69,7 @@ void testApartmentsInsert() { reviewRepository.save(review1); - apartment1.getReviews().add(review1); + //apartment1.getReviews().add(review1); apartmentRepository.save(apartment1); @@ -115,4 +115,23 @@ void testReviewsInsert() { } + @Test + void testHOAcalculation() { + ArrayList properties = new ArrayList<>(); + + properties.add(new Apartment(40, "hola", 3, 2, 2, true, true, 7)); + properties.add(new House(30, "hola", 2, 2, 2, true, 20, true, true, true, true, 20, true, 30)); + properties.add(new Duplex(70, "hola", 2, 9, 2, true, 20, true, true, false, false, 20, true)); + properties.add(new Townhouse(70, "hola", 2, 9, 2, true, 20, true, true, false, false, 20, true)); + + for (ResidentialProperty property : properties) { + if (property.requiresHomeownersAssociation()) { + System.out.println(property + " requiere una asociación de propietarios"); + } + else { + System.out.println(property + " no requiere una asociación de propietarios"); + } + } + } + } diff --git a/db/apartmentpredictordb.mv.db.mv.db b/db/apartmentpredictordb.mv.db.mv.db new file mode 100644 index 0000000..6305e52 Binary files /dev/null and b/db/apartmentpredictordb.mv.db.mv.db differ diff --git a/db/apartmentpredictordb.mv.db.trace.db b/db/apartmentpredictordb.mv.db.trace.db new file mode 100644 index 0000000..2261b94 --- /dev/null +++ b/db/apartmentpredictordb.mv.db.trace.db @@ -0,0 +1,309 @@ +2025-12-12 13:28:31.265795+01:00 jdbc[13]: exception +org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "APARTMREVIEW" not found; SQL statement: +SELECT * FROM APARTMREVIEW ENT [42102-224] +2025-12-12 13:41:16.064397+01:00 database: flush +org.h2.message.DbException: General error: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/Alumne_mati1/Desktop/JAVA/ApartmentPredictor/db/apartmentpredictordb.mv.db.mv.db [2.2.224/7]" [50000-224] + at org.h2.message.DbException.get(DbException.java:212) + at org.h2.message.DbException.convert(DbException.java:407) + at org.h2.mvstore.db.Store.lambda$new$0(Store.java:122) + at org.h2.mvstore.MVStore.handleException(MVStore.java:1546) + at org.h2.mvstore.MVStore.panic(MVStore.java:371) + at org.h2.mvstore.MVStore.(MVStore.java:291) + at org.h2.mvstore.MVStore$Builder.open(MVStore.java:2035) + at org.h2.mvstore.db.Store.(Store.java:133) + at org.h2.engine.Database.(Database.java:326) + at org.h2.engine.Engine.openSession(Engine.java:92) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:424) + at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:273) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:105) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66) + at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:129) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) + at org.hibernate.boot.model.relational.Database.(Database.java:45) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:223) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:191) + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:169) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1432) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1503) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:352) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1822) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1771) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1173) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:936) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:323) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1442) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:552) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:191) + at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:130) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:247) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:163) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$10(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310) + at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735) + at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734) + at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$6(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$4(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:106) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:105) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:69) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:123) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:123) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:90) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:94) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:52) + at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:70) + at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:100) + at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:40) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:520) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:748) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:443) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:211) +Caused by: org.h2.jdbc.JdbcSQLNonTransientException: General error: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/Alumne_mati1/Desktop/JAVA/ApartmentPredictor/db/apartmentpredictordb.mv.db.mv.db [2.2.224/7]" [50000-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:566) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 138 more +Caused by: org.h2.mvstore.MVStoreException: The file is locked: C:/Users/Alumne_mati1/Desktop/JAVA/ApartmentPredictor/db/apartmentpredictordb.mv.db.mv.db [2.2.224/7] + at org.h2.mvstore.DataUtils.newMVStoreException(DataUtils.java:996) + at org.h2.mvstore.SingleFileStore.lockFileChannel(SingleFileStore.java:143) + at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:117) + at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:81) + at org.h2.mvstore.MVStore.(MVStore.java:286) + ... 132 more +2025-12-12 13:41:18.016423+01:00 database: flush +org.h2.message.DbException: General error: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/Alumne_mati1/Desktop/JAVA/ApartmentPredictor/db/apartmentpredictordb.mv.db.mv.db [2.2.224/7]" [50000-224] + at org.h2.message.DbException.get(DbException.java:212) + at org.h2.message.DbException.convert(DbException.java:407) + at org.h2.mvstore.db.Store.lambda$new$0(Store.java:122) + at org.h2.mvstore.MVStore.handleException(MVStore.java:1546) + at org.h2.mvstore.MVStore.panic(MVStore.java:371) + at org.h2.mvstore.MVStore.(MVStore.java:291) + at org.h2.mvstore.MVStore$Builder.open(MVStore.java:2035) + at org.h2.mvstore.db.Store.(Store.java:133) + at org.h2.engine.Database.(Database.java:326) + at org.h2.engine.Engine.openSession(Engine.java:92) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:125) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:424) + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:39) + at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:63) + at org.hibernate.tool.schema.extract.spi.ExtractionContext.getQueryResults(ExtractionContext.java:43) + at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:39) + at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.initializeSequences(DatabaseInformationImpl.java:66) + at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.(DatabaseInformationImpl.java:60) + at org.hibernate.tool.schema.internal.Helper.buildDatabaseInformation(Helper.java:185) + at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:98) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:286) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:145) + at java.base/java.util.HashMap.forEach(HashMap.java:1429) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:142) + at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) + at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) + at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:295) + at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:450) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1507) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:352) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1822) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1771) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1173) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:936) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:323) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1442) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:552) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:191) + at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:130) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:247) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:163) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$10(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310) + at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735) + at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734) + at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$6(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$4(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:106) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:105) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:69) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:123) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:123) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:90) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:94) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:52) + at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:70) + at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:100) + at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:40) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:520) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:748) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:443) + at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:211) +Caused by: org.h2.jdbc.JdbcSQLNonTransientException: General error: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/Alumne_mati1/Desktop/JAVA/ApartmentPredictor/db/apartmentpredictordb.mv.db.mv.db [2.2.224/7]" [50000-224] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:566) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 142 more +Caused by: org.h2.mvstore.MVStoreException: The file is locked: C:/Users/Alumne_mati1/Desktop/JAVA/ApartmentPredictor/db/apartmentpredictordb.mv.db.mv.db [2.2.224/7] + at org.h2.mvstore.DataUtils.newMVStoreException(DataUtils.java:996) + at org.h2.mvstore.SingleFileStore.lockFileChannel(SingleFileStore.java:143) + at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:117) + at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:81) + at org.h2.mvstore.MVStore.(MVStore.java:286) + ... 136 more diff --git a/docs/appends/JPA_Before_Annotatons b/docs/appends/JPA_Before_Annotatons new file mode 100644 index 0000000..e69de29 diff --git a/docs/appends/JPA_Before_Annotatons:_one-to-many-xml.md b/docs/appends/JPA_Before_Annotatons:_one-to-many-xml.md deleted file mode 100644 index fd9a2fa..0000000 --- a/docs/appends/JPA_Before_Annotatons:_one-to-many-xml.md +++ /dev/null @@ -1,89 +0,0 @@ -# Before annotations: one to many .xml - -> Before annotations were common, the `Apartment–Review` relationship was defined in `ORM XM`L (Hibernate `*.hbm.xml` or JPA `orm.xml`), and Spring only wired the `ORM laye`r (`SessionFactory`/`EntityManagerFactory`, **transactions**) via its own XML. -> -> The mapping itself did not live in Spring XML. - -## Hibernate mapping XML example - -For classic Hibernate (pre‑JPA style), you would have something like this: - -- `Apartment.hbm.xml` would map the table and the one‑to‑many collection. -- `Review.hbm.xml` would map the table and the many‑to‑one back to `Apartment`. - -Conceptually (simplified): - -**Apartment.hbm.xml** - -```xml - - - - - - - - - - - - -``` - -**Review.hbm.xml** - -```xml - - - - - - - - - -``` - -> This yields exactly the same schema as your annotated example: a `review.apartment_fk` foreign key pointing to `apartment.id`. - -## JPA orm.xml variant - -If instead of pure Hibernate XML you used JPA with XML mappings, the idea was similar: define the entities in Java as plain POJOs, then describe table/relationship mapping in `META-INF/orm.xml`. - -There you would configure: - -- An ``: - - with an `` referencing `Review`. -- An ``: - - with a `` and ``. - -Again, same relational model, just expressed in JPA XML instead of annotations. - -## How Spring saw it - -Spring before `Boot`: - -- Defined `DataSource`, `LocalSessionFactoryBean` (for Hibernate) or `LocalContainerEntityManagerFactoryBean` (for JPA) in Spring XML, pointing to `Apartment.hbm.xml` / `Review.hbm.xml` or `persistence.xml`/`orm.xml`. -- Defined a **transaction manager bean and DAOs/services** that injected `SessionFactory` or `EntityManager`. - -So to “create the relationship without annotations” for `Apartment`–`Review`: - -- Entities: plain Java classes with fields and getters/setters, no `@Entity`, `@OneToMany`, etc. -- Relationship: defined in Hibernate `*.hbm.xml` or JPA `orm.xml`. -- Spring: only responsible for wiring the ORM configuration and transactions, not for modeling the association itself. - -## References: - -1. [13 & Object Relational Mapping (ORM) Data Access](https://docs.spring.io/spring-framework/docs/3.0.1.RELEASE/reference/html/orm.html) -2. [40 & XML Schema-based configuration](https://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/xsd-configuration.html) -3. [A Beginner's Guide to JPA's persistence.xml](https://thorben-janssen.com/jpa-persistence-xml/) -4. [Mapping JPA to XML](https://docs.oracle.com/middleware/1213/toplink/solutions/jpatoxml.htm) -5. [Using Hibernate ORM and Jakarta Persistence - Quarkus](https://quarkus.io/guides/hibernate-orm) -6. [Working with Relationships in Spring Data REST | Baeldung](https://www.baeldung.com/spring-data-rest-relationships) -7. [Hibernate ORM 5.4.33.Final User Guide](https://docs.hibernate.org/orm/5.4/userguide/html_single) -8. [Define @Type in orm.xml (Spring Data / JPA 2.1 /Hibernate 5.3.7/Postgresql)? - Stack Overflow](https://stackoverflow.com/questions/55046340/define-type-in-orm-xml-spring-data-jpa-2-1-hibernate-5-3-7-postgresql) -9. [The Grails Framework 2.1.1](https://grails.apache.org/docs/2.1.1/guide/single.html) -10. https://docs.spring.io/spring-integration/docs/2.1.0.RELEASE/reference/pdf/spring-integration-reference.pdf