У меня есть два класса сущностей A и B. Для A существует только один экземпляр класса B. Через жизненный цикл приложения мне нужно создать новый insta для B для A. Но для журнала истории мне нужно для хранения предыдущего экземпляра B со ссылками на этот экземпляр A. Так что я создал следующее отображение:JPA cross unireirectional OneToOne
@Entity
class A {
@OneToOne
@JoinColumn(name="B_ID")
B b;
}
@Entity
class B {
@OneToOne
@JoinColumn(name="A_ID")
A a;
}
///////
CREATE TABLE A_TABLE (ID uuid, B_ID uuid, FOREIGN KEY (B_ID) REFERENCES B_TABLE(ID));
CREATE TABLE B_TABLE (ID uuid, A_ID uuid, FOREIGN KEY (A_ID) REFERENCES A_TABLE(ID));
У меня уже есть некоторые правильные данные в моих таблицах, но каждый раз, когда я пытаюсь получить любой экземпляр класса А, поле Ь нуль. Итак, что я делаю неправильно?
UPD_0 Хорошо, вот что я действительно имеем дело с:
@MappedSuperclass
public abstract class BaseUuidEntity {
@Id
@Column(name = "ID")
@Persistent
protected UUID id;
}
@MappedSuperclass
public class StandartEntity extends BaseUuidEntity { ... }
@MappedSuperclass
public abstract class AbstractEntity extends BaseUuidEntity { ... }
@Entity(name = "CardEntity")
@Table(name = "TBL_CARD")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "CARD_TYPE", discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue("0")
public class CardEntity extends AbstractEntity { ... }
@Entity("aEntity")
@DiscriminatorValue("1")
@Table(name = "A_TABLE")
class A extends CardEntity {
@OneToOne
@JoinColumn(name="B_ID")
B b;
public String getBName() {
return b.getName(); // NullPointerException
}
}
@Entity("bEntity")
@Table(name = "B_TABLE")
class B extends StandartEntity {
@Column(name="name")
String name;
public String getName() {
return this.name;
}
}
-- A_TABLE (ID, B_ID)
'41a2647d-2ef6-f507-92ee-bff0f784b6f3', '5d3c66da-b377-11e4-bc9c-1008b124eacf'
-- B_TABLE (ID, A_TABLE, NAME)
'5d3c66da-b377-11e4-bc9c-1008b124eacf', '41a2647d-2ef6-f507-92ee-bff0f784b6f3', 'Some text'
Я получаю все А объекты (в моем случае - это один)
select e from aEntity e
и пытается чтобы получить имя объекта b в каждом из них, но получая nullpointer, причина b равна null;
Как вы получаете экземпляр класса A? Можете ли вы показать свой код? –
Просто простой запрос по Id: Запрос q = em.createQuery («выберите e из my.package.A e, где e.id =: id"); q.setParameter ("id", needed_uid); q.getSingleResult(); –
Этот код выглядит хорошо, поэтому проблема должна быть с чем-то, что вы не показываете. У вас есть аннотации @Id в ваших сущностях? Можете ли вы показать им? –