JPA 2.0 Hibernate @OneToMany + @MapKeyJoinColumn

OneToMany + MapKeyJoinColumn对我不起作用,请说明我做错了什么。

我正在使用JPA 2.0 + Hibernate 3.6.1并希望映射以下表:


对语言关系的陈述的问题


到课程:


@Entity public class Question { // id and other fields @OneToMany(mappedBy="question", cascade = CascadeType.ALL) @MapKeyJoinColumn(name="language_id") private Map statements = new HashMap(); } @Entity public class Statement { @Id private Long id; @ManyToOne @JoinColumn(name = "language_id", nullable = true) private Language language; @ManyToOne @JoinColumn(name = "question_id", nullable = false) private Question question; @Column(name = "message") private String message; } @Entity public class Language { @Id private Long id; @Column(name = "name") private String name; } 

但它不起作用。 EntityManager正确地保留它,但是当我检索Question时,在它的语句映射中只有一个语言到空的条目。 请帮忙


Edit1 :奇怪,但是当我预加载所有语言时,如下所示:

 String sql = "select l from Language l"; List languages = entityManager.createQuery(sql, Language.class).getResultList(); 

然后它的作品!
有谁知道如何让hibernate自动加载某些类的所有对象?

实际上,类Statement中的id属性必须是复合主键。 表语句中不需要statement_id。 主键由language_id和question_id组成。

试试看:

  @Entity public class Statement implements Serializable { private static final long serialVersionUID = 1L; @EmbeddedId private StatementId id = new StatementId(); @Column(name = "message") private String message; } @Embeddable private static class StatementId implements Serializable { private static final long serialVersionUID = 1L; StatementId(){} @ManyToOne private Question product; @ManyToOne private Language language; } 

并且不要忘记Question中的fetchType以避免LazyInitializationExceptions。

 public class Question { @OneToMany(mappedBy="id.question", fetch=FetchType.EAGER) @MapKeyJoinColumn(name="language_id") private Map statements = new HashMap(); } 

希望它会有所帮助。

你在使用二级缓存吗? 您的对象已经是会话的一部分(第一级缓存)吗? 尝试清除会话()

尝试调用statements.size()以确保获取数据,或者您可以尝试定义与EAGER的关系的获取类型:@OneToMany(mappedBy =“question”,cascade = CascadeType.ALL,fetch = FetchType.EAGER)

你可能想读这个: http : //en.wikibooks.org/wiki/Java_Persistence/Relationships#Eager_Join_Fetching