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
- 为什么Hibernate 4.2使用jandex和classmate,如果它的Maven POM将它们定义为测试范围?
- Hibernate Native SQL Query在连接中检索多个实体
- 如何使用Hibernate创建数据库架构
- 如何使用Spring 4.0.6全局设置FlushMode for Hibernate 4.3.5.Final?
- Hibernate实体存储为HttpSession属性值
- JPA – 使用mappedBy属性来定义拥有实体的不同之处
- 如何使用hibernate查询连接表?
- Hibernate + Spring使用多个数据源?
- Hibernate使用嵌入的ElementCollection抛出ConcurrentModificationException