我对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);
- 这会是合适的方式吗?
感谢您的帮助。
答案 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上使用级联是奇怪的:这意味着每次修改其中一个事件时,您可能会创建/修改用户。