Я хочу создать сопоставление один к одному между Customer Entity и OptIn. Опция OptIn необязательна. Вот почему внешний ключ должен быть в OptIn. При развертывании я получаю следующее сообщение об ошибке, потому что отображение не может быть найдено:OneToOne Сопоставление с гибернацией/JBoss/Seam
OneToOneSecondPass.java:135
значения: Otherside = OPTIN, mappedBy = клиент
otherSideProperty = BinderHelper.findPropertyByName (Otherside , mappedBy);
java.lang.NullPointerException на org.hibernate.cfg.OneToOneSecondPass.doSecondPass (OneToOneSecondPass.java:135) на org.hibernate.cfg.Configuration.secondPassCompile (Configuration.java:1130) в org.hibernate .cfg.AnnotationConfiguration.secondPassCompile (AnnotationConfiguration.java:296) на org.hibernate.cfg.Configuration.buildMappings (Configuration.java:1115) ...
Что я могу сделать, чтобы получить правильное отображение?
@Entity
@Table(name = "KPS_OPT_IN", schema = "EB")
public class OptIn extends KmsEntity implements java.io.Serializable {
private static final long serialVersionUID = -8818445355079384264L;
private int id; /* kps_kunden_nr */
private Customer customer;
public OptIn() {
}
@Id
@Column(name = "KPS_KUNDEN_NR", unique = true, nullable = false)
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
@OneToOne
@PrimaryKeyJoinColumn(name="KPS_KUNDEN_NR", referencedColumnName="KPS_KUNDEN_NR")
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
this.setId(customer.getId());
}
}
@Entity
@Table(name = "KPS_KUNDEN", schema = "EB")
public class Customer extends KmsEntity implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private int id;
private OptIn optIn;
public Customer() {
}
public Customer(int id) {
this.id = id;
}
@Id
@GeneratedValue(generator="seqkpskunde")
@SequenceGenerator(name="seqkpskunde",sequenceName="SEQ_KPS_KUNDE")
@Column(name = "KPS_KUNDEN_NR", unique = true, nullable = false)
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
if(optIn!=null){
optIn.setId(id);
}
}
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "customer")
public OptIn getOptIn() {
return optIn;
}
public void setOptIn(OptIn optIn) {
this.optIn = optIn;
}
}
Спасибо вам большое. Я попробую это завтра. Вы имеете в виду, что OptIn является необязательным, если ключ/Id не находится ни в одной из обеих таблиц? –
Клиент является владельцем этих отношений. Поэтому, если у вас есть Клиент с pk = 314 и OptIn с pk = 314, то связь будет там. Если у вас нет OptIn с pk = 314, свойство 'Customer.optIn' будет NULL. – ChssPly76
К сожалению, я не смог заставить его работать, если идентификатор для соединения - это ссылки из OptIn (mappedBy = «клиент»), только если я использую идентификатор в Customer. Я использую hibernate 3.2.4sp1 и аннотации 3.3.0GA. Решение с использованием идентификатора от Клиента является для меня удовлетворительным. –