[英]Hibernate - mapping collections with auto FK
我对ManyToSomething关系有疑问。 我无法进行注释以正确生成FK。 也许这是整个想法的错误(例如,仅通过级联保留一个实体)。
让我们在程序中的某个位置放一些简化的代码:
Conversation conversation = new Conversation(){{
getMessages().add(new Message());
}};
session.persist(conversation);
// OR LIKE THIS:
Message message = new Message();
Conversation conversation = new Conversation();
message.setConversation(conversation);
session.persist(message);
然后简化Hibernate批注:
@Entity
public class Message{
@Id
@GeneratedValue
private int id;
@ManyToOne
private Conversation conversation;
}
@Entity
public class Conversation{
@Id
@GeneratedValue
private int id;
@OneToMany(mappedBy = "conversation", cascade = CascadeType.PERSIST)
private Set<Message> messages = new HashSet<Message>();
public Set<Message> getMessages() {
return messages;
}
}
因此,会话FK应该保留在消息中(一个会话-许多消息)。 但是,当Java代码运行时,数据库仅写入新的ID,而在会话端则没有FK。 这怎么可能?
更新1(仍然没有运气):
@Entity
@Table(name = "conversation_message")
public class Message{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(unique = true, nullable = false)
private int id;
@ManyToOne
@JoinColumn(name = "conversation_id", insertable = false, updatable = false)
private Conversation conversation;
... (other fields + getters/setters without annotation)
}
@Entity
public class Conversation{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(unique = true, nullable = false)
private int id;
@OneToMany(mappedBy = "conversation", cascade = CascadeType.PERSIST)
private Set<Message> messages = new HashSet<Message>();
... (other fields + getters/setters without annotation)
}
UPDATE 2(带有UPDATE 1注释),对此:
Conversation conversation = new Conversation();
conversation.getMessages().add(new Message(){{
setConversation(conversation);
setText("test");
}});
session.persist(conversation);
休眠日志:
insert
into
conversation
(course_id, created, name, replies, user_id)
values
(null, null, null, true, null)
insert
into
conversation_message
(file, sent, text) // There is missing conversation_id at all
values
(null, null, "Test")
我在您的代码中看不到任何Id
字段...您可能都缺少的是:
private Integer id;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "ID", unique = true, nullable = false)
public Integer getId() {
return this.id;
}
然后它将在持久化时自动生成。
更新:还需要在Messages
表中包含外键,您需要这样做:
@JoinColumn(name = "conversation_id", insertable = false, updatable = false)
@ManyToOne
private Conversation conversation;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.