I try to create an OneToOne relationship between two tables but I receive errors.
I used a lot of tutorials but nothing helps. For example baeldung tutorial:
Project structure:
@Entity
@Table(name="user")
public class User{
@Id
@Column
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "personal_data_id")
private PersonalData personalData;
//getters, setters
}
@Entity
@Table(name = "personal_data")
public class PersonalData {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@OneToOne(mappedBy = "personal_data")
private User user;
//getters, setters
}
The error:
Caused by: org.hibernate.AnnotationException: Unknown mappedBy in: com....dto.PersonalData.user, referenced property unknown: com...dto.User.personal_data
Gradle:
plugins {
id 'org.springframework.boot' version '2.7.3'
id 'io.spring.dependency-management' version '1.0.13.RELEASE'
id 'java'
}
group = 'com.hltr'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.30'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
}
tasks.named('test') {
useJUnitPlatform()
}
application.properties:
#Database settings spring.datasource.url=jdbc:mysql://localhost:3306/db?useUnicode=yes&characterEncoding=UTF-8 spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=update spring.datasource.tomcat.connection-properties=useUnicode=true;characterEncoding=utf-8; spring.datasource.sql-script-encoding=UTF-8 spring.jpa.open-in-view=false #Disable thymeleaf cashing spring.template.cache = false;
Advertisement
Answer
You need to use a field name for mappedby, not a column name.
In you case, it should be @OneToOne(mappedBy = "personalData").