【问题标题】:Hibernate mapping a map without a join tableHibernate 映射没有连接表的映射
【发布时间】:2012-12-17 05:29:03
【问题描述】:

我正在尝试使用休眠来映射这样的对象:

@Entity
public class ParentClass {  
    @Id
    @GeneratedValue
    int Id;

    @OneToMany
    Map<String, ChildClass> map;
}

@Entity
public class ChildClass {
    @Id
    @GeneratedValue
    int Id;

    String text;
}

我不希望 Hibernate 创建连接表。我希望它为 ChildClass 的表添加一列。我也不想为 ChildClass 中的键添加字段。理想情况下,当保存对象时,Hibernate 会自动获取映射中的键并将其保存在相应的表中,并在查询时执行相反的操作。这可能吗?

如果我必须向 ChildClass 添加一个字段作为键,hibernate 可以使用地图中的键自动填充该字段吗?我问的原因是因为我从 JSON Web 服务获取数据并使用 Jackson 解析它,我不知道有一种方法可以让 Jackson 将键复制到值对象中的字段。我可以编写代码来手动执行此操作,但我宁愿避免这样做。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    没有可连接的单向关系:

    @Entity
    public class Customer implements Serializable {
        @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
        @JoinColumn(name="CUST_ID")
        public Set<Ticket> getTickets() {
        ...
    }
    
    @Entity
    public class Ticket implements Serializable {
        ... //no bidir
    }   
    

    双向无接头:

    @Entity
    public class Troop {
        @OneToMany(mappedBy="troop")
        public Set<Soldier> getSoldiers() {
        ...
    }
    
    @Entity
    public class Soldier {
        @ManyToOne
        @JoinColumn(name="troop_fk")
        public Troop getTroop() {
        ...
    }
    

    来自文档:http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/
    将这些示例应用到您的案例中。

    【讨论】: