使用Hibernate不会将分配映射键保存在数据库中

时间:2014-08-20 19:04:54

标签: java hibernate

我正在尝试使用Hibernate中的java.util.Map做一个简单的示例,方法是创建一个Customer实体,其中包含Order个实体的地图。

以下是我的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属性。所以当我创建一个带有键的地图时,&#34; 100&#34;并尝试使用Hibernate进行保存,然后在TB_ORDER表的数据库中将该字段设置为空。但是,如果我尝试使用order.setOrderNumber(&#34; 100&#34;),那么该值将保存到数据库中。请告诉我我在哪里做错了?

1 个答案:

答案 0 :(得分:1)

你没有犯任何错误。保持对象图在内存中的一致性是您的责任。映射到数据库中列的内容是Order实体的orderNumber字段。因此,如果它为null,则Hibernate会在列中保存null。

MapKey注释告诉Hibernate在从数据库加载客户订单并填充地图时如何从实体中提取密钥。这就是全部。