Hibernate ManyToOne другое поведение - PullRequest
0 голосов
/ 27 июня 2018

У меня есть два объекта «Пользователи» и четыре объекта «Курсы».

Случай 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>

1 Ответ

0 голосов
/ 27 июня 2018

Потому что вы допустили ошибку в своем классе 'Курсы'.

  1. В классе есть один участник, который указывает на один конкретный курс. Так что нельзя указывать на два разных курса. Никогда.

  2. Имена ваших классов и членов (переменных) не являются стандартом Java и очень сложны для понимания всеми, кто привык к стандарту. Никогда не используйте множественное число для имен классов. И всегда используйте правильное название для вещи.

Это неправильно: private Users user_course;
Это было бы лучше: private User user;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...