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

时间:2011-03-23 23:43:37

标签: java hibernate insert entity

我对Hibernate相当新,并且在实体具有FK时如何处理Insert有疑问;具体如何创建要插入的实体。

我的实体简化了以下结构:

@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,但要创建Event,我需要整个User对象,而不仅仅是它的ID。

所以,问题:

- 这是一个设计错误吗? Event是否只有'int userID'字段而不是'User user'?

- Hibernate有什么方法可以解决这个问题?类似的东西:

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

- 这会是合适的方式吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您应该可以在用户上添加一对多,例如:

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

然后您只需要通过您拥有的ID获取用户,将事件添加到集合中并保留。我相信这应该有用。

答案 1 :(得分:0)

Event eventToInsert = new Event(45, 6, (User) session.load(User.class, userIdValue));

但如果你不了解Session.load和Session.get,我建议你阅读Hibernate documentation。这是最基本的东西:通过主键加载实体。

另外,请注意,在ManyToOne上使用级联是奇怪的:这意味着每次修改其中一个事件时,您可能会创建/修改用户。