2012-10-24 199 views
9

我想要使用连接表在两个表之间执行一对多的关系。休眠一对多使用连接表和休眠注释

这就是为什么我想要使用一个连接表:

最后,我想用Hibernate的注解来执行此操作。

我发现了一些使用xml映射但没有注释的例子。

我相信这会是怎样的表需要创建

CREATE TABLE `PRODUCT` (
    `PRODUCT_ID`  BIGINT  PRIMARY KEY AUTO_INCREMENT 
); 

CREATE TABLE `PARTS` (
    `PART_ID`   BIGINT  PRIMARY KEY AUTO_INCREMENT 
); 

-- USER_IMAGE_ID must be unique if we want a one-to-many relationship between PRODUCTS & PARTS tables 
CREATE TABLE `USER_DETAILS_IMAGE` (
    `PRODUCT_ID`  BIGINT, 
    `PART_ID`   BIGINT UNIQUE, 
    CONSTRAINT `FK_PRODUCT_ID` FOREIGN KEY (`PRODUCT_ID`) REFERENCES `PRODUCT`(`PRODUCT_ID`), 
    CONSTRAINT `FK_PART_ID`  FOREIGN KEY (`PART_ID`)  REFERENCES `PARTS`(`PART_ID`) 
); 

回答

24

不要找例子。阅读official documentation

@Entity 
public class Product { 

    private String serialNumber; 
    private Set<Part> parts = new HashSet<Part>(); 

    @Id 
    public String getSerialNumber() { return serialNumber; } 
    void setSerialNumber(String sn) { serialNumber = sn; } 

    @OneToMany 
    @JoinTable(
      name="PRODUCT_PARTS", 
      joinColumns = @JoinColumn(name="PRODUCT_ID"), 
      inverseJoinColumns = @JoinColumn(name="PART_ID") 
    ) 
    public Set<Part> getParts() { return parts; } 
    void setParts(Set parts) { this.parts = parts; } 
} 


@Entity 
public class Part { 
    ... 
} 

另外,请注意,这是对单向一对多关联的默认。因此,如果默认表格和列名称适合您,则甚至不必提供@JoinTable注释。

+0

谢谢JB Nizet。我更新了我的问题,我相信所需的表格看起来像。那是对的吗? –

+0

感谢您指出文档(单页版本非常方便!)。我确实发现了准确但不友好的文档,这就是为什么我在开始使用新技术时总是寻找示例的原因。这是一种很好,但错过了表格创建部分http://www.dzone.com/tutorials/java/hibernate/hibernate-example/hibernate-mapping-one-to-many-using-annotations-1.html –

+0

看起来不错,除了SERIAL_NUMBER应该是PRODUCT_ID以匹配注释。 –