Hibernate - 使用自动FK映射集合 [英] Hibernate - mapping collections with auto FK

查看:86
本文介绍了Hibernate - 使用自动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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆