繁体   English   中英

Hibernate-使用自动FK映射集合

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM