Hibernate - 使用自动FK映射集合 [英] Hibernate - mapping collections with auto FK
问题描述
我有许多关系问题。我无法做出正确生成FK的注释。也许这是一个很糟糕的想法(例如,只能通过级联来坚持一个实体)。
让我们在程序的某个地方使用这个简化代码:
对话对话=新对话(){{
getMessages()。add(new Message());
}};
session.persist(对话);
//或者像这样:
Message message = new Message();
对话对话=新对话();
message.setConversation(conversation);
session.persist(message);
然后简化Hibernate注释:
@Entity
public class Message {
@Id
@GeneratedValue
private int id;
@ManyToOne
私人对话对话;
}
@实体
公共类会话{
@Id
@GeneratedValue
private int id ;
@OneToMany(mappedBy =conversation,cascade = CascadeType.PERSIST)
private Set< Message> messages = new HashSet< Message>();
public Set< Message> getMessages(){
返回消息;
$ b因此,对话的FK应该保留在Message (一次对话 - 许多消息)。但是,当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对话对话;
...(其他字段+没有注解的getters / setters)
}
@实体
公共类对话{
@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>();
...(其他字段+没有注解的getters / setters)
}
UPDATE 2(带有UPDATE 1注释),在这个上面:
对话对话=新的对话();
conversation.getMessages()。add(new Message(){{
setConversation(conversation);
setText(test);
}});
session.persist(对话);
Hibernate日志:
将
插入
对话
(course_id,created,name,回复,user_id)
values
(null,null,null,true, null)
在
中插入
conversation_message
(文件,发送,文本)//所有
的值缺少conversation_id
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
私人会话对话;
I have a problem with ManyToSomething relations. I can't make an annotation that generates properly FKs. Maybe it is whole idea bad (e.g. persisting just one Entity with cascading).
Let's have this simplified code somewhere in program:
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);
And then simplified Hibernate annotation:
@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; } }
So, the FK for Conversation should be kept in Message (One Conversation - Many Messages). But when the Java code runs, database writes only new ids, without FK on Conversation side. How is it possible?
UPDATE 1 (still no luck):
@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 (with UPDATE 1 Annotation), on this:
Conversation conversation = new Conversation(); conversation.getMessages().add(new Message(){{ setConversation(conversation); setText("test"); }}); session.persist(conversation);
Hibernate log:
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")
解决方案I don't see any
Id
field in your code... What you probably missing is this in both:private Integer id; @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "ID", unique = true, nullable = false) public Integer getId() { return this.id; }
Then it will be generated automatically on persisting.
UPDATE: Also to have the foreign key in the table
Messages
you need this:@JoinColumn(name = "conversation_id", insertable = false, updatable = false) @ManyToOne private Conversation conversation;
这篇关于Hibernate - 使用自动FK映射集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!