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

Java 分配映射键不会使用Hibernate保存在数据库中,java,hibernate,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"

我尝试在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>();;
}
现在,我创建了一个程序来保存客户和订单:

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();
    }
}
公共类AppTest{
公共静态void main(字符串[]args){
会话会话=HibernateUtil.getSessionFactory().getCurrentSession();
保存客户(会话);
HibernateUtil.getSessionFactory().close();
}
私有静态void saveCustomer(会话){
session.getTransaction().begin();
客户=新客户();
订单=新订单();
order.setCustomer(客户);
//订单。设置订单号(“100”);
Map Map=newhashmap();
地图放置(“100”,顺序);
客户订单(map);
session.save(客户);
会话。保存(命令);
session.getTransaction().commit();
}
}

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

你没有做错。你有责任在记忆中保持对象图的连贯性。映射到数据库中列的是订单实体的
orderNumber
字段。因此,如果为null,Hibernate会在列中保存null


MapKey
注释告诉Hibernate,当它从数据库加载客户订单并填充映射时,如何从实体中提取密钥。仅此而已。

感谢您澄清JB。那么,这是否意味着Hibernate/JPA在保存实体时从不使用HashMap的键,因此我可以将我的键设置为null?还有什么方法可以让Hibernate在不设置我的订单实体属性的情况下也保留我的密钥呢?不,不是。顺便说一句,映射是关联的反面,因此Hibernate需要知道订单的customer字段是否存在关联。orderNumber列映射到orderNumber字段,因此Hibernate从中获取该列的值。但是为什么要为密钥设置null?那没有道理。一个映射只能有一个空键,你希望你的对象图是正确的,不是吗?关于你的最后一个问题,AFAIK,no.你能解释一下,
映射是关联的反面是什么意思吗
,因为我还在学习hibernate,我无法理解这句话。阅读并
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();
    }
}