Java @复合键类中的OneTONE注释无效

Java @复合键类中的OneTONE注释无效,java,hibernate,jpa,Java,Hibernate,Jpa,也许有人可以澄清以下代码的错误。当我在嵌入式类(它是复合主键)中创建一对一关联时,如下面的代码所示: @Entity public class Test { @EmbeddedId private TestId id; @Embeddable public static class TestId implements Serializable { private static final long serialVersionUID = 1950

也许有人可以澄清以下代码的错误。当我在嵌入式类(它是复合主键)中创建一对一关联时,如下面的代码所示:

@Entity
public class Test {

    @EmbeddedId
    private TestId id;

    @Embeddable
    public static class TestId implements Serializable {
        private static final long serialVersionUID = 1950072763330622759L;

        @OneToOne(optional = false)
        @JoinColumn(name = "linkedTable_id")
        private LinkedTable linkedTable;

    }
    ..........
}
我得到以下堆栈跟踪:

--------------------------------------------

Caused by: java.lang.NullPointerException
    at org.hibernate.cfg.AnnotationBinder.bindOneToOne(AnnotationBinder.java:1867)
    at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1286)
    at org.hibernate.cfg.AnnotationBinder.fillComponent(AnnotationBinder.java:1662)
    at org.hibernate.cfg.AnnotationBinder.bindId(AnnotationBinder.java:1695)
    at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1171)
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:706)
    at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:452)
    at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:268)
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1121)
    at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1211)
    at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:154)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:847)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:178)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:235)
    ... 26 more

有趣的是,如果我将关联类型更改为多对一,而不使用一对一,为什么上面的示例可以工作?

我不知道这是可能的,但根据Hibernate注释参考文档,它是(但这是特定于Hibernate的):

(……)

虽然JPA中不支持,但Hibernate 允许您放置您的关联 直接在嵌入式id组件中 (而不必使用
@MapsId
注释)

对于您提供的代码,下面的代码片段对我很有用:

LinkedTable linkedTable = new LinkedTable();
linkedTable.setId(1l);
session.persist(linkedTable);
session.flush();

Test.TestId testId = new Test.TestId();
testId.setLinkedTable(linkedTable);
Test test = new Test();
test.setId(testId);
session.persist(test);
session.flush();
使用Hibernate EM 3.4.0.GA、Hibernate Annotations 3.4.0.GA和Hibernate Core 3.3.0.SP1进行测试


如果它对您不起作用,您能提供更多的代码来重现问题吗?

亲爱的Pascal,谢谢您的回答。我已经用Hibernate版本检查过了,它确实可以工作。现在,我不知道到底是什么导致了这个问题。我使用Hibernate+JPA组合,我认为问题在于JPA。Graffinych:好吧,正如我写的,我用Hibernate实体管理器(即Hibernate+JPA)测试了这个。
LinkedTable linkedTable = new LinkedTable();
linkedTable.setId(1l);
session.persist(linkedTable);
session.flush();

Test.TestId testId = new Test.TestId();
testId.setLinkedTable(linkedTable);
Test test = new Test();
test.setId(testId);
session.persist(test);
session.flush();