У меня есть два объекта «Пользователи» и четыре объекта «Курсы».
Случай 1: - (что я понимаю)
Объекты Mapping Courses № 1 и 2 с объектом Users № 1 и Mapping Courses № 3 и 4 с объектом Users № 2.
Записи в БД: -
Таблица пользователей: -
имя пользователя
1 один 1
2 Два 2
Таблица курсов: -
Имя курса
1 курс один 1
2 CourseTwo 1
3 CourseThree 2
4 курсFour 2
Случай 2: - (Различное поведение)
Объекты Mapping Courses № 1 и 2 с объектом Users № 1 и Mapping Courses объект № 2,3 и 4 с объектом Users № 2.
Записи в БД: -
Таблица пользователей: -
имя пользователя
1 один 1
2 Два 2
Таблица курсов: -
Имя курса
1 курс один 1
2 CourseTwo 2
3 CourseThree 2
4 курсFour 2
ВОПРОСЫ: - Почему объект Курс № 2 не вставляется вместе с объектом № 1 Пользователя? Я ожидаю записи в таблице курсов для случая 2, как показано ниже "-
Таблица курсов: -
Имя курса
1 курс один 1
2 CourseTwo 1
2 CourseTwo 2
3 CourseThree 2
4 курсFour 2
Похоже, что проблема с courseId была первичной, и первая запись переопределяется со второй записью, если так, то как можно обработать этот сценарий?
КОД: -
Основной класс (приложение)
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class App
{
public static void main(String[] args)
{
SessionFactory factory = new Configuration().configure().addAnnotatedClass(Users.class).addAnnotatedClass(UserDetails.class).addAnnotatedClass(Courses.class).buildSessionFactory();
Session session = factory.getCurrentSession();
Users userOne = new Users("One");
Users userTwo = new Users("Two");
UserDetails detailsOne = new UserDetails("detailOne");
UserDetails detailsTwo = new UserDetails("detailTwo");
Courses courseOne = new Courses("CourseOne");
Courses courseTwo = new Courses("CourseTwo");
Courses courseThree = new Courses("CourseThree");
Courses courseFour = new Courses("CourseFour");
userOne.setDetails(detailsOne);
userTwo.setDetails(detailsTwo);
userOne.addCourse(courseOne);
userOne.addCourse(courseTwo);
userTwo.addCourse(courseThree);
userTwo.addCourse(courseFour);
//userTwo.addCourse(courseOne);
session.beginTransaction();
session.save(userOne);
session.save(userTwo);
session.getTransaction().commit();
session.close();
factory.close();
}
}
Класс пользователей: -
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
@Entity
public class Users
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
int userid;
String name;
@OneToOne( cascade = CascadeType.ALL)
@JoinColumn(name = "details_id")
private UserDetails details;
@OneToMany(mappedBy = "user_course",cascade = CascadeType.ALL)
private List<Courses> courseList;
public void addCourse(Courses course)
{
if(courseList == null)
{
courseList = new ArrayList<Courses>() ;
}
courseList.add(course);
course.setUser_course(this);
}
public List<Courses> getCourseList() {
return courseList;
}
public void setCourseList(List<Courses> courseList) {
this.courseList = courseList;
}
public Users(String name) {
this.name = name;
}
public Users() {
}
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public UserDetails getDetails() {
return details;
}
public void setDetails(UserDetails details) {
this.details = details;
}
}
Класс UserDetails: -
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import org.hibernate.engine.internal.Cascade;
@Entity
public class UserDetails
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
int detailsid;
String location;
@OneToOne(mappedBy = "details", cascade = CascadeType.ALL)
private Users user;
public Users getUser() {
return user;
}
public void setUser(Users user) {
this.user = user;
}
public UserDetails() {
}
public UserDetails(String location) {
this.location = location;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
}
Курсы класс: -
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Courses
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
int course_id;
String courseName;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "userId")
private Users user_course;
public String getCourseName() {
return courseName;
}
public Courses(String courseName) {
super();
this.courseName = courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public Users getUser_course() {
return user_course;
}
public void setUser_course(Users user_course) {
this.user_course = user_course;
}
}
Файл конфигурации: -
<!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>
<property name = "connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<property name = "connection.url">jdbc:sqlserver://20.198.58.29:1433;instanceName=SQLEXPRESS;databaseName=DB</property>
<property name = "connection.username">sa</property>
<property name = "connection.password">deteam@123</property>
<property name = "show_sql">true</property>
<property name = "dialect">org.hibernate.dialect.SQLServer2008Dialect</property>
<property name = "connection.pool_size">1</property>
<property name = "current_session_context_class">thread</property>
<property name = "hibernate.hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>