Вставка объекта Hibernate с отношением «многие к одному» - PullRequest
2 голосов
/ 24 марта 2011

Я довольно новичок в Hibernate и у меня есть вопрос о том, как обрабатывать вставку, когда у сущности есть FK; в частности, как создать сущность для вставки.

Мои сущности имеют следующую упрощенную структуру:

@Entity
@Table(name="event")
public class Event implements java.io.Serializable {

    private int id;
    private int eventType
    private User user;  

    public Event (int id, int eventType, User user) {
        this.id = id;
        this.eventType = eventType;
        this.user = user;
    }

    @Id
    @Column(name="ID")
    public int getId() {
        return this.id;
    }

    @Column(name="EVENT_TYPE", nullable=false)
    public int getEventType() {
        return this.eventType;
    }

    @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, targetEntity=User.class )
    @JoinColumn(name="USER_ID")
    public User getUser() {
        return this.user;
    }
    ...
}

-----------

@Entity
@Table(name="user")
public class Event implements java.io.Serializable {

    private int id;
    private String name;

    public User (int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Id
    @Column(name="ID")
    public int getId() {
        return this.id;
    }

    @Column(name="Name", nullable=false)
    public String getName() {
        return this.name;
    }
    ...
}

Теперь я хочу сохранить новое событие, и у меня есть UserID, связанный с пользователем этого события.

Мне нужно создать что-то вроде:

Event eventToInsert = new Event(45,6,  *User object I don't have*);

, чтобы позже сказать hibernate сохранить eventToInsert.

Моя проблема в том, что у меня есть только UserID, но для создания события мне нужен весь объект User, а не только его ID.

Итак, вопросы:

-Это конструктивная ошибка? В событии должно быть только поле int userID вместо «User user»?

- Есть ли у Hibernate способ решить эту проблему? Что-то вроде:

Event eventToInsert = new Event(45,6, Hibernate.getEntity(UserTable, UserIdValue);

-Какой подходящий способ сделать это?

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 24 марта 2011

Вы должны быть в состоянии поставить один на многих на пользователя, что-то вроде:

@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private final Set<Event> events = new HashSet<Event>();

тогда вам просто нужно получить пользователя по идентификатору, который у вас есть, добавить событие в коллекцию и сохранить его. Я считаю, что это должно работать.

0 голосов
/ 24 марта 2011
Event eventToInsert = new Event(45, 6, (User) session.load(User.class, userIdValue));

Но если вы не знаете о Session.load и Session.get, я предлагаю вам прочитать документацию Hibernate . Это самая простая вещь: загрузка сущности по ее первичному ключу.

Также обратите внимание, что наличие каскада на ManyToOne является странным: это означает, что вы потенциально можете создавать / изменять пользователя каждый раз, когда вы изменяете одно из его событий.

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