插入具有多对一关系的Hibernate实体

2022-03-14 00:00:00 insert entity java Hibernate

我是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 User 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;
    }
    ...
}

现在我要持久化一个新事件,并且已将用户ID与该事件的用户相关联。

我需要创建如下内容:

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);

-执行此操作的合适方式是什么?

感谢您的帮助。


解决方案

Event eventToInsert = new Event(45, 6, (User) session.load(User.class, userIdValue));
但是,如果您不了解Session.load和Session.get,我建议您阅读Hibernate documentation。这是最基本的内容:按实体的主键加载实体。

还要注意,在ManyToOne上有一个级联是很奇怪的:这意味着您可能会在每次修改ManyToOne的某个事件时创建/修改用户。

相关文章