Как отобразить производные идентичности в Hibernate 3? - PullRequest
0 голосов
/ 21 ноября 2010

У меня следующая ситуация:

@Entity
class A{ 
  @Id
  @SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID")
  private Long aId;
  @OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL)
  private B b;
  ...
}
@Entity
class B{
  @Id
  private A a;
  ...
}

Другими словами: существует связь OneToOne между A и B. B является слабым объектом, и его Id получен из класса A.

Я уже тестировал некоторые решения, добавляя @PrimaryKeyJoinColumn в @OneToOne, как упоминается в этой статье . Но я получил эту ошибку: "org.hibernate.id.IdentifierGenerationException: идентификаторы для этого класса должны быть назначены вручную перед вызовом save (): B"
Я не знаю, насколько это актуально в этом случае, но я использую Oracle 11g.

ОБНОВЛЕНО

Я думаю, что я на правильном пути. Вот актуальное состояние моей проблемы:

@Entity
class A{ 
  @Id
  @SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID")
  private Long aId;
  @OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL)
  @PrimaryKeyJoinColumn(name="aId")
  private B b;
  ...
}
@Entity
class B{
  @Id
  @OneToOne
  @JoinColumn(name="aId)
  private A a;
  ...
}

Ошибка теперь немного другая:

java.sql.SQLException: ORA-00904: "B"."A": invalid identifier  

Он пытается найти столбец A (вместо AID) в таблице B. Я не знаю, как указать, что имя столбца - B.AID, а не B.A.

Ответы [ 2 ]

2 голосов
/ 21 ноября 2010

Я решил мою проблему по этой ссылке

Правильный ответ будет:

@Entity
public class A {

  @Id
  @GeneratedValue
  @Column(name = "aId")
  private Long id;

  @OneToOne(fetch = FetchType.LAZY, optional=false, cascade = CascadeType.ALL, mappedBy = "a")
  private B b;
  ... 
} 


@Entity
@org.hibernate.annotations.GenericGenerator(name="a-primarykey", strategy="foreign", parameters={@org.hibernate.annotations.Parameter(name="property", value="a")})
public class B {

  @Id
  @GeneratedValue(generator = "a-primarykey")
  @Column(name = "aId")
  private Long id;

  @OneToOne
  @PrimaryKeyJoinColumn
  private A a;
  ...
} 
1 голос
/ 21 ноября 2010

Вы пробовали это на Entity B?

@Entity class B {
  @Id @OneToOne 
  @JoinColumn(name = "table_a_id") //put the correct column name for A's pk here
  private A a;
  ....
}
...