2009-10-28 3 views
0

Я хочу создать сопоставление один к одному между 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; 
    } 
} 

ответ

2

Я не уверен, что вы имеете в виду под "внешним ключом должен быть в OptIn". Вы сопоставили свою ассоциацию @OneToOne через @PrimaryKeyJoinColumn, что означает, что ваши сущности будут связаны через их идентификационные значения. Это также означает, что:

  1. Вы не можете указать имена столбцов в пределах @PrimaryKeyJoinColumn аннотация; вместо этого они будут взяты из соответствующих столбцов @Id.
  2. Маркировка выборки как LAZY бессмысленна и будет игнорироваться; необязательные ассоциации @OneToOne: всегда с нетерпением.
  3. Единственный способ OptIn был бы необязательным в этой ассоциации, если в базе данных не было записи с данным идентификатором.

Какие версии Hibernate/Annotations вы используете? Если они довольно старые, это может быть ошибкой в ​​коде Hibernate. Но я считаю, что он должен работать, если вы исправите (1) и (2) выше.

+0

Спасибо вам большое. Я попробую это завтра. Вы имеете в виду, что OptIn является необязательным, если ключ/Id не находится ни в одной из обеих таблиц? –

+0

Клиент является владельцем этих отношений. Поэтому, если у вас есть Клиент с pk = 314 и OptIn с pk = 314, то связь будет там. Если у вас нет OptIn с pk = 314, свойство 'Customer.optIn' будет NULL. – ChssPly76

+0

К сожалению, я не смог заставить его работать, если идентификатор для соединения - это ссылки из OptIn (mappedBy = «клиент»), только если я использую идентификатор в Customer. Я использую hibernate 3.2.4sp1 и аннотации 3.3.0GA. Решение с использованием идентификатора от Клиента является для меня удовлетворительным. –

Смежные вопросы