2011-12-07 24 views
2

我有一张有三列“A”,“B”和“C”的表格。其中两列(A和B)是表格的组合主键。我为这个表编写了一个Java类,我使用Hibernate将类中的数据映射到表中的数据。我为Embedded(即复合)键创建了另一个类。Hibernate:使用EmbeddedIds复制getters/setters?

这两个类是这样的:

@Entity 
@Table(name="SOME_TABLE", schema="SOME_SCHEMA") 
public class Outer { 
    private Key key; 
    private String a; 
    private String b; 
    private String c; 

    @EmbeddedId 
    public Key getId() { 
     return this.key; 
    } 

    // Also a setter for Key... 

    @Column(name="A") 
    public String getA() { 
     return this.a; 
    } 

    public void setA(final String a) { 
     this.a = a; 
    } 

    // Also setters and getters for B and C. 
} 

​​

看起来好像所有的Hibernate文档都会掩盖getter和setter应该去的地方。 Outer和Key是否应该为组成复合键的值设置setter?如果我在两个地方都有一个setter,那么如果我在Outer上设置A的值,Hibernate是否做了正确的事情(即,在Key上设置值)? Outer.getA/B()和Outer.setA/B()是否应该遵循Key类?

我认为在两个地方设置相同数据的代码实践是不好的编码习惯。这至少是不明确的。我希望Hibernate会为我设置Key类的值,但我想确切地知道。谢谢!

-Joe

回答

1

我不是100%肯定与@EmbeddedId但我认为它必须处理方式与常规@Embedded性质一样的,所以我觉得应该映射是这样的:

@Entity 
@Table(name="SOME_TABLE", schema="SOME_SCHEMA") 
public class Outer { 
    private Key key; 
    // no fields a and b here 
    private String c; 

    @EmbeddedId 
    public Key getId() { 
     return this.key; 
    } 

    // Also a setter for Key... 

    @Transient 
    public String getA() { 
     return this.key.getA(); 
    } 

    public void setA(final String a) { 
     this.key.setA(a); 
    } 

    @Transient 
    public String getB() { 
     return this.key.getB(); 
    } 

    public void setB(final String b) { 
     this.key.setB(b); 
    } 

    // Also setters and getters for C. 
} 
+0

谢谢,tscho。我很少使用@Embedded,所以我没有跳到那里的连接。我想,回答我原来的问题,“委托给关键”是方法。 – joemadeus