У меня есть главная и дочерняя таблицы на сервере MS SQL.У меня есть ссылка на внешний ключ в дочерней таблице.Но все же связь не устанавливается, значение становится нулевым.
Итак, у меня есть таблица «Student» и таблица «AcademicInfo».Ниже приведены его столбцы.
Student -> [StudentId, Имя, Фамилия, Город]
AcademicInfo -> [Id, StudentIdentity, Subject, Year]
Теперь мойвнешний ключ находится в дочерней таблице, которая представляет собой AcademicInfo (StudentIdentity) со столбцом StudentId родительского Student.
В моем случае отношения один к одному, так как один студент может иметь только один предмет (только для целей упражнения)
AcademicInfo.java
package com.luv2code.hibernate.demo.entity;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name="AcademicInfo")
public class AcademicInfo {
public AcademicInfo()
{}
public AcademicInfo(String subject, Integer year) {
Subject = subject;
Year = year;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="Id")
private int Id;
@Column(name="Subject")
public String Subject;
@Column(name="Year")
public Integer Year;
public int getId() {
return Id;
}
public void setId(int id) {
Id = id;
}
public String getSubject() {
return Subject;
}
public void setSubject(String subject) {
Subject = subject;
}
public Integer getYear() {
return Year;
}
public void setYear(Integer year) {
Year = year;
}
@Override
public String toString() {
return "AcademicInfo [Id=" + Id + ", Subject=" + Subject + ", Year=" + Year + "]";
}
@OneToOne(cascade= {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.DETACH,CascadeType.REFRESH})
@JoinColumn(name="StudentIdentity")
private Student studentInfo;
public Student getStudentInfo() {
return studentInfo;
}
public void setStudentInfo(Student studentInfo) {
this.studentInfo = studentInfo;
}
}
Student.java
package com.luv2code.hibernate.demo.entity;
import javax.persistence.*;
@Entity
@Table(name="StudentDetails")
public class Student {
public Student()
{}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="StudentID")
private int StudentID;
@Column(name="Name")
public String StudentName;
@Column(name="Surname")
public String Surname;
@Column(name="City")
public String City;
public int getStudentID() {
return StudentID;
}
public void setStudentID(int studentID) {
StudentID = studentID;
}
public String getName() {
return StudentName;
}
public void setName(String name) {
StudentName = name;
}
public String getSurname() {
return Surname;
}
public void setSurname(String surname) {
Surname = surname;
}
public String getCity() {
return City;
}
public void setCity(String city) {
City = city;
}
public Student(String name, String surname, String city) {
StudentName = name;
Surname = surname;
City = city;
}
@Override
public String toString() {
return "Student [StudentID=" + StudentID + ", StudentName=" + StudentName + ", Surname=" + Surname + ", City="
+ City + "]";
}
@OneToOne(mappedBy="studentInfo",cascade= {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.DETACH,CascadeType.REFRESH})
private AcademicInfo academicDetails;
public AcademicInfo getAcademicDetails() {
return academicDetails;
}
public void setAcademicDetails(AcademicInfo academicDetails) {
this.academicDetails = academicDetails;
}
}
Главное приложение
package com.luv2code.hibernate.newDemo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.luv2code.hibernate.demo.entity.AcademicInfo;
import com.luv2code.hibernate.demo.entity.Student;
public class CreateStudentDemo {
public static void main(String[] args) {
SessionFactory factory = new Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(AcademicInfo.class)
.addAnnotatedClass(Student.class)
.buildSessionFactory();
Session session = factory.getCurrentSession();
session.beginTransaction();
Student theStudent1 = new Student("Andy","test","NY");
AcademicInfo stuAcademics = new AcademicInfo("OS", 2001);
theStudent1.setAcademicDetails(stuAcademics);
System.out.println(theStudent1);
session.save(stuAcademics);
session.getTransaction().commit();
try {
}
finally {
factory.close();
}
}
}
Ниже следует "hibernate.cfg.xml"
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- JDBC Database connection settings -->
<property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<property name="connection.url">jdbc:sqlserver://localhost:1433;databaseName=India;integratedSecurity=true</property>
<property name="connection.username">sa</property>
<property name="connection.password">Temp1234</property>
<!-- JDBC connection pool settings ... using built-in test pool -->
<property name="connection.pool_size">100</property>
<!-- Select our SQL dialect -->
<property name="dialect">org.hibernate.dialect.SQLServer2008Dialect</property>
<!-- Echo the SQL to stdout -->
<property name="show_sql">true</property>
<!-- Set the current session context -->
<property name="current_session_context_class">thread</property>
</session-factory>
</hibernate-configuration>
Выдает ошибку следующим образом: Невозможно вставить значение NULL в столбец 'StudentIdentity', таблица 'dbo.AcademicInfo';столбец не допускает пустых значений.INSERT завершается неудачей.
Если я объявил ассоциацию, почему studentId не вставляется автоматически?