2009-10-28 130 views
0

我想创建Entity Customer和OptIn之间的一对一映射。 OptIn实体是可选的。 这就是为什么外键必须在OptIn中。在部署我得到以下错误,因为 映射无法找到:休眠/ JBoss/Seam的OneToOne映射

OneToOneSecondPass.java:135

值: 阿瑟赛德=选择启用,的mappedBy =客户

otherSideProperty = BinderHelper.findPropertyByName(阿瑟赛德,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在org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1115) (AnnotationConfiguration.java:296) ...

我能做些什么,以获得正确的映射?

@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

我不知道你是什么意思“外键必须在选择启用”。您已通过@PrimaryKeyJoinColumn映射您的@OneToOne关联,这意味着您的实体将通过其ID值进行关联。这也意味着:

  1. 您不能在@PrimaryKeyJoinColumn注释中指定列名;它们将取自两个实体的相应@Id列。
  2. 将标记取为LAZY毫无意义并且将被忽略;可选@OneToOne协会总是热切地提取。
  3. 对于此关联,只有OptIn可选的唯一方法是如果在数据库中没有给定ID的条目。

您使用的是什么Hibernate/Annotations版本?如果它们很老,那可能是Hibernate代码中的一个错误。但是我相信如果你修正上面的(1)和(2),它应该可以工作。

+0

非常感谢,迄今为止。我明天会试试这个。 您的意思是,如果密钥/ ID不在这两个表中,OptIn只是可选的? – 2009-10-28 17:42:28

+0

客户是这种关系的所有者。所以如果你有pk = 314的客户和pk = 314的OptIn,那么关系就在那里。如果您没有pk = 314的OptIn,则Customer.optIn属性将为NULL。 – ChssPly76 2009-10-28 17:46:22

+0

不幸的是,如果连接的id是来自OptIn(mappedBy =“customer”)的引用,那么我不能工作,只有当我在Customer中使用id时。我使用的是hibernate 3.2.4sp1和注释3.3.0GA。 使用客户ID的解决方案对我来说是令人满意的。 – 2009-10-29 08:58:09