mysql - 简单的 hibernate 不起作用,但级联查询可以

标签 mysql hibernate orm

我有一个“transactionitems”表,其中包含父“transactions”表的 FK。我在查询解析事务行的“transactionitems”表时没有问题。但是,当我直接查询事务表时,我没有得到任何结果。我在控制台中看不到任何错误或异常。

像下面这样的方法调用会产生正确的结果

Session s = DataAccess.ObtainSession();
        Criteria cr = s.createCriteria(TransactionItem.class);
        cr.createAlias("transaction", "transaction");
        cr.add(Restrictions.eq("transaction.id", txid));
        List<TransactionItem> results = cr.list();

但是更简单的方法调用返回空列表

 Session s = DataAccess.ObtainSession();
        Criteria cr = s.createCriteria(Transaction.class);
        List<Transaction> list = cr.list();

下面的 Hibernate 映射文件和类

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.beraben.drycleanpos3.entities.Transaction" table="transactions">
        <id column="id" name="id">
            <generator class="increment"/>
        </id>
        <property name="customerName" column="customer_name"/>
        <property name="customerContact" column="customer_contact"/>
        <property name="createdDate" type="date" column="created_datetime"/>
        <property name="dueDate" type="date" column="due_datetime"/>
        <property name="readyDate" type="date" column="ready_datetime"/>
        <property name="jobClosedDate" type="date" column="job_closed_datetime"/>
        <property name="notes" />
    </class>
</hibernate-mapping>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.beraben.drycleanpos3.entities.TransactionItem" table="transaction_items">

        <id column="id" name="id">
            <generator class="increment"/>
        </id>
        <many-to-one class="com.beraben.drycleanpos3.entities.Transaction" column="transaction_id" name="transaction" cascade="merge" not-null="true" />
        <property name="garmentTypeName" column="garment_type_name"/>
        <property name="jobTypeName" column="job_type_name"/>
        <property name="price"/>
        <property name="notes"/>

    </class>
</hibernate-mapping>



public class TransactionItem {
    private int id;
    private Transaction transaction;
    private String garmentTypeName;
    private String jobTypeName;
    private int price;
    private String notes;


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Transaction getTransaction() {
        return transaction;
    }

    public void setTransaction(Transaction transaction) {
        this.transaction = transaction;
    }

    public String getGarmentTypeName() {
        return garmentTypeName;
    }

    public void setGarmentTypeName(String garmentTypeName) {
        this.garmentTypeName = garmentTypeName;
    }

    public String getJobTypeName() {
        return jobTypeName;
    }

    public void setJobTypeName(String jobTypeName) {
        this.jobTypeName = jobTypeName;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getNotes() {
        return notes;
    }

    public void setNotes(String notes) {
        this.notes = notes;
    }



}



public class Transaction {
    private int id;
    private String customerName;
    private String customerContact;

    @JsonSerialize(using = CustomDateSerializer.class)
    private Date createdDate;

    @JsonSerialize(using = CustomDateSerializer.class)
    private Date dueDate;

    @JsonSerialize(using = CustomDateSerializer.class)
    private Date readyDate;

    @JsonSerialize(using = CustomDateSerializer.class)
    private Date jobClosedDate;

    private String notes;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getCustomerName() {
        return customerName;
    }

    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }

    public String getCustomerContact() {
        return customerContact;
    }

    public void setCustomerContact(String customerContact) {
        this.customerContact = customerContact;
    }

    @JsonSerialize(using = CustomDateSerializer.class)
    public Date getCreatedDate() {
        return createdDate;
    }

    @JsonSerialize(using = CustomDateSerializer.class)
    public void setCreatedDate(Date createdDate) {
        this.createdDate = createdDate;
    }

    @JsonSerialize(using = CustomDateSerializer.class)
    public Date getDueDate() {
        return dueDate;
    }

    @JsonSerialize(using = CustomDateSerializer.class)
    public void setDueDate(Date dueDate) {
        this.dueDate = dueDate;
    }

    @JsonSerialize(using = CustomDateSerializer.class)
    public Date getReadyDate() {
        return readyDate;
    }

    @JsonSerialize(using = CustomDateSerializer.class)
    public void setReadyDate(Date readyDate) {
        this.readyDate = readyDate;
    }

    @JsonSerialize(using = CustomDateSerializer.class)
    public Date getJobClosedDate() {
        return jobClosedDate;
    }

    @JsonSerialize(using = CustomDateSerializer.class)
    public void setJobClosedDate(Date jobClosedDate) {
        this.jobClosedDate = jobClosedDate;
    }

    public String getNotes() {
        return notes;
    }

    public void setNotes(String notes) {
        this.notes = notes;
    }

    @Override
    public String toString() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
        return "Transaction{" + "id=" + id + ", customerName=" + customerName + ", customerContact=" + customerContact + ", createdDate=" + sdf.format(createdDate) + ", dueDate=" + sdf.format(dueDate) + ", readyDate=" + readyDate + ", jobClosedDate=" + jobClosedDate + ", notes=" + notes + '}';
    }

最佳答案

实际上这些问题应该作为对您问题的评论,但不幸的是我还没有权限。

您的映射显示您已在 TransactionItem 中映射 Transaction,但没有从 Transaction 到 TransactionItem 的链接。在这种情况下,您能更具体地介绍一下结果吗?

  1. 在查询 Transaction 时,您是否完全没有得到任何结果,或者您是否说结果中不包含 TransactionItem 数据?

  2. 当您对TransactionItem执行查询时,您是否看到Transaction的数据?

此外,检查 Hibernate 用于获取数据的最终查询的日志。如果您尝试直接在 SQL 中执行它,它可能会告诉您为什么它不起作用。

关于mysql - 简单的 hibernate 不起作用,但级联查询可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36255975/

相关文章:

php - 为什么 {if row exist then fetch them} 不起作用?

mysql - 如何制作独一无二且难以猜测和预测的代币?

java - WHERE 中的 JPQL 单个集合元素

hibernate - 加入获取一对多关系多次返回同一实体

mysql - CAKEPHP 3 保存成功后数据库中的关闭日期不为空,它具有今天的值

java - Hibernate 将对象保存到多个 session

mysql - 如何查询具有唯一标识符的行及其各自的最大值?

mysql - mysql中如何写多个and条件

java - 为什么hibernate删除操作不起作用?

java - 来自谷歌的 ORM