Может быть, кто-нибудь сможет прояснить, что не так с кодом ниже.Когда я создаю однозначную ассоциацию внутри встроенного класса (это составной первичный ключ), как в приведенном ниже коде:
@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; логическое предпочтениеКлиент; } @Embeddable class CustomerId реализует Serializable { @Один к одному @JoinColumns ({ @JoinColumn (name = "userfirstname_fk", referencedColumnName = "firstName"), @JoinColumn (name = "userlastname_fk", referencedColumnName = "lastName") }) Пользователь-пользователь; String customerNumber; } @Организация class User { @EmbeddedId UserId id; Целочисленный возраст; } @Embeddable class UserId реализует 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 Annotations 3.4.0.GA и Hibernate Core 3.3.0.SP1.
Если это не сработает, не могли бы вы предоставить еще немного кода, позволяющего воспроизвести проблему?