繁体   English   中英

复合键类中的@OneToOne注释不起作用

[英]@OneToOne annotation within composite key class is not working

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

@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 Annotation参考文档,它是(虽然这是特定于Hibernate的):

2.2.3.2.1。 @EmbeddedId属性

(...)

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

 @Entity class Customer { @EmbeddedId CustomerId id; boolean preferredCustomer; } @Embeddable class CustomerId implements Serializable { @OneToOne @JoinColumns({ @JoinColumn(name="userfirstname_fk", referencedColumnName="firstName"), @JoinColumn(name="userlastname_fk", referencedColumnName="lastName") }) User user; String customerNumber; } @Entity class User { @EmbeddedId UserId id; Integer age; } @Embeddable class UserId implements Serializable { String firstName; String lastName; } 

借助您提供的代码,以下代码段对我也适用:

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批注3.4.0.GA和Hibernate Core 3.3.0.SP1进行了测试。

如果对您不起作用,您是否可以提供更多代码来重现问题?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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