Возможность создания новой записи, несмотря на отношение один к одному - PullRequest
0 голосов
/ 08 октября 2018

Я использую базу данных памяти Spring Boot H2 и у меня есть три таблицы:

Заем, Альбом, Клиент

loan и customer объединены в one-to-one, в то время кактаблицы loan и album объединены в many-to-many

A customer может создать только один loan, а loan может иметь только одну customer.Тем не менее, я могу создать новый кредит с тем же клиентом и новым списком альбомов.

Вот мой кредитный объект:

@Entity
public class Loan implements Serializable {

private static final long serialVersionUID = 0x62B6DA99AA12AAA8L;

@Column @GeneratedValue(strategy = GenerationType.AUTO) @Id private    Integer id;

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "loan_album", joinColumns = @JoinColumn(name = "loan_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "album_id", referencedColumnName = "id"))
private List<Album> albums = new ArrayList<>();

@OneToOne(fetch = FetchType.EAGER)
private Customer customer;

// @Column private Integer customerId;
@Column private Date dateLoaned;
@Column private Date dateToReturn;
@Column private Boolean expired;

public Loan() {

}

public Loan(Customer customer, Date dateLoaned, Date dateToReturn,List<Album> albums) {
    this.albums = albums;
    this.customer = customer;
    this.dateLoaned = dateLoaned;
    this.dateToReturn = dateToReturn;
    this.expired=false;
}

Ивот моя Клиентская организация

@Entity
public class Customer implements Serializable {

private static final long serialVersionUID = 0x63A6DA99AA12A8A8L;

@Column @GeneratedValue(strategy = GenerationType.AUTO) @Id private Integer id;
@Column private String firstname;
@Column private String surname;
@Column private String address;
@Column private String town;
@Column private String postcode;
@Column (unique=true) private String personalnumber;
@Column (unique=true) private String emailaddress;
@Column private Boolean enabled;

@OneToOne()
private Loan loan;

public Customer() {

}

public Customer(String firstname, String surname, String address, String town, String postcode, String personalnumber, String emailaddress) {
    this.firstname = firstname;
    this.surname = surname;
    this.address = address;
    this.postcode = postcode;
    this.town = town;
    this.personalnumber = personalnumber;
    this.emailaddress = emailaddress;
    this.enabled=true;
}

public Customer(String firstname, String surname, String address, String postcode, String town, String personalnumber, String emailaddress, Loan loan) {
    this.firstname = firstname;
    this.surname = surname;
    this.address = address;
    this.postcode = postcode;
    this.town = town;
    this.personalnumber = personalnumber;
    this.emailaddress = emailaddress;
    this.enabled=true;
    this.loan = loan;
}

Альбомная сущность:

@Entity
public class Album implements Serializable {

private static final long serialVersionUID = 0x63A6DA99AA12AAA8L;

@Column @GeneratedValue(strategy = GenerationType.AUTO) @Id private Integer id;

@Column (unique=true) private String barcode;
@Column private String band;
@Column private String title;
@Column private String genre;
@Column private Integer year;
@Column private String artworkFilename;
@Column private Boolean enabled;
@Column private Boolean isLoanable;
@Column private Integer numberOfCopies;

@ManyToMany(mappedBy = "album")
private List<Loan> loan = new ArrayList<>();

public Album() {

}

public Album(String barcode, String band, String title, String genre, Integer year, Integer numberOfCopies) {
    this.barcode = barcode;
    this.band = band;
    this.title = title;
    this.genre = genre;
    this.year = year;
    this.enabled = true;
    this.isLoanable = true;
    this.numberOfCopies = numberOfCopies;
}

public Album(String barcode, String band, String title, String genre, Integer year, Integer numberOfCopies, List<Loan> loan) {
    this.barcode = barcode;
    this.band = band;
    this.title = title;
    this.genre = genre;
    this.year = year;
    this.enabled = true;
    this.isLoanable = true;
    this.numberOfCopies = numberOfCopies;
    this.loan = loan;
}

Исключение:

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2018-10-08 08:12:11.570 ERROR 11132 --- [  restartedMain] o.s.boot.SpringApplication               : Application startup failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.library.demo.entity.Loan.album in com.library.demo.entity.Album.loan
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
    at com.library.demo.BootLibraryApplication.main(BootLibraryApplication.java:31) [classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_172]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_172]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_172]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_172]
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-1.5.3.RELEASE.jar:1.5.3.RELEASE]
Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.library.demo.entity.Loan.album in com.library.demo.entity.Album.loan
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:769) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:719) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:54) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1655) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1623) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]

1 Ответ

0 голосов
/ 08 октября 2018

Один к одному: здесь для OneToOne отношений отображения в вашей организации клиента, установите nullable = true, чтобы разрешить клиенту создавать без ссуды:

@OneToOne(fetch = FetchType.LAZY, 
cascade = CascadeType.ALL, 
mappedBy = "customer", nullable = true) 
private Loan loan;

и иметь клиентав вашей кредитной организации ..

@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "customer_id", nullable = false)
private Customer customer;

Многие ко многим: ваши отношения со стороны займа, как показано ниже, относятся к альбомам:

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "loan_album", joinColumns = @JoinColumn(name = "loan_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "album_id", referencedColumnName = "id"))
    private List<Album> albums = new ArrayList<>();

и в альбоме сущность сопоставленапо займу.

 @ManyToMany(mappedBy = "album")
private List<Loan> loan = new ArrayList<>();

Убедитесь, что у вас есть зависимость данных jpa пружины в вашем пом:

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...