【问题标题】:Assigning a map key is not saved in database using Hibernate分配映射键未使用 Hibernate 保存在数据库中
【发布时间】:2014-10-14 06:32:01
【问题描述】:

我正在尝试通过创建带有Order 实体映射的Customer 实体来在Hibernate 中使用java.util.Map 做一个简单的示例。

这是我的 Java 类:

Customer.java:

@Entity
public class Customer {
    @Id
    @GeneratedValue
    private Integer id;

    @OneToMany(mappedBy = "customer")
    @MapKey(name = "orderNumber")
    private Map<String, Order> orders = new  HashMap<String, Order>();;
}

Order.java

@Entity
@Table(name="TB_ORDER")
public class Order {
    @Id
    @GeneratedValue
    private Integer id;

    private String orderNumber;

    @ManyToOne
    private Customer customer;
}

现在我创建了一个程序来保存客户和订单:

public class AppTest {
    public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        saveCustomer(session);
        HibernateUtil.getSessionFactory().close();
    }

    private static void saveCustomer(Session session) {
        session.getTransaction().begin();
        Customer customer = new Customer();
        Order order = new Order();
        order.setCustomer(customer);
        //order.setOrderNumber("100");
        Map<String, Order> map = new HashMap();
        map.put("100", order);
        customer.setOrders(map);
        session.save(customer);
        session.save(order);
        session.getTransaction().commit();
    }
}

根据我的映射,Map 的键代表我的 Order 类的 orderNumber 属性。因此,当我创建一个键为“100”的地图并尝试使用 Hibernate 保存时,该字段在我的数据库中为 TB_ORDER 表设置为空。但是,如果我尝试使用 order.setOrderNumber("100") 那么该值将保存到数据库中。请告诉我我在哪里做错了?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    你没有犯任何错误。维护内存中对象图的连贯性是您的责任。映射到数据库中列的是 Order 实体的 orderNumber 字段。所以如果为null,Hibernate会在列中保存null。

    MapKey 注释告诉 Hibernate 在从数据库加载客户订单并填充映射时如何从实体中提取键。就是这样。

    【讨论】:

    • 感谢您澄清 JB。那么这是否意味着我的 HashMap 的键在保存实体时从未被 Hibernate/JPA 使用,所以我可以将 null 作为我的键?还有什么方法可以告诉 Hibernate 在不设置我的 Order 实体属性的情况下也保留我的密钥?
    • 不,不是。顺便说一句,映射是关联的反面,因此对 Hibernate 重要的是订单的客户字段以了解关联是否存在。 orderNumber 列映射到 orderNumber 字段,因此这是 Hibernate 获取此列的值的地方。你为什么要为你的钥匙输入 null 呢?那没有意义。一张地图只能有一个空键,你希望你的对象图是正确的,不是吗?关于你的最后一个问题,AFAIK,没有。
    • 你能解释一下map is the inverse side of the association是什么意思,因为我还在学习hibernate,我无法理解这个说法。
    猜你喜欢
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2012-01-11
    • 2012-08-10
    • 2018-12-17
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多