Java 在Hibernate中使用映射不起作用

Java 在Hibernate中使用映射不起作用,java,hibernate,Java,Hibernate,我试图使用java.util.Map创建一个简单的程序。我创建了一个Customer实体类,其中包含Order类的映射。以下是我的Java类: Customer.java @Entity public class Customer { @Id @GeneratedValue private Integer id; @OneToMany(mappedBy = "customer") @MapKey(name = "orderNumber") pri

我试图使用
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;
}
@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);
        session = HibernateUtil.getSessionFactory().getCurrentSession();
        showCustomer(session);
        HibernateUtil.getSessionFactory().close();
    }

    private static void showCustomer(Session session) {
        session.getTransaction().begin();
        List<Customer> list = session.createQuery("from Customer").list();
        for (Customer customer : list) {
            System.out.println("customer id : "+customer.getId()+ ", customer orders : "+customer.getOrders());
        }
        session.getTransaction().commit();
    }

    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();
    }
}

Hibernate只生成一个
select
query以获取客户详细信息,但不从
tbu订单
表中获取任何数据。所以当我试图从客户那里得到订单时,我得到的是空的。请告诉我此代码中的错误在哪里。

您还必须使用@MapKeyJoinColumn,最好在pojo中初始化您的映射,然后重试


private Map orders=new Map()

看起来您缺少@JoinColumn注释,通过该注释您可以知道谁是关系的所有者。出于这个原因,我认为你应该像这样改变课程顺序:

@Entity
@Table(name="TB_ORDER")
public class Order {
    @Id
    @GeneratedValue
    private Integer id;
    private String orderNumber;
    @ManyToOne
    @JoinColumn(name = "customer_id")
    private Customer customer;
}

而且应该可以正常工作。

我更新了代码并用HashMap初始化,但仍然不起作用,我得到订单的输出为:
客户订单:{}
您是否尝试过@MapKeyJoinColumn???以及在您的HashMap中,您将密钥传递为null。是的,现在我还尝试添加了
@MapKeyJoinColumn
,bu仍然获得订单的空地图。我现在尝试了此操作,结果仍然获得空地图。您是否可以尝试删除@MapKey(name=“orderNumber”)注释并转换私有地图订单;私人订单列表;告诉我们它是否有效?因为如果这两种方式都不起作用,那么您的配置可能会出问题。另外,您是否为字段提供了正确的Getter和Setter,因为它们是私有的?我在您的代码映射中也看到Map=newhashmap();map.put(null,order);客户订单(map);和map.put(null,order);这肯定是错误的。您应该将其更改为map.put(order.orderNumber,order);谢谢你的意见。我已经制作了列表映射,并观察到了相同的问题,并且观察到我的客户实体类中订单的setter方法不正确,因此导致了此问题。我很高兴能够提供帮助^^
@Entity
@Table(name="TB_ORDER")
public class Order {
    @Id
    @GeneratedValue
    private Integer id;
    private String orderNumber;
    @ManyToOne
    @JoinColumn(name = "customer_id")
    private Customer customer;
}