簡體   English   中英

一對一休眠未映射

[英]hibernate one - to - one not mapped

這些是MySQL數據庫中的表的外觀:

mysql> DESCRIBE customer;
+-------------+----------------------+------+-----+
| Field       | Type                 | Null | Key |
+-------------+----------------------+------+-----+
| customer_id | smallint(5) unsigned | NO   | PRI |
| first_name  | varchar(45)          | NO   |     |
| last_name   | varchar(45)          | NO   |     |
| address_id  | smallint(5) unsigned | NO   | MUL |
+-------------+----------------------+------+-----+

mysql> DESCRIBE address;
+-------------+----------------------+------+-----+
| Field       | Type                 | Null | Key |
+-------------+----------------------+------+-----+
| address_id  | smallint(5) unsigned | NO   | PRI |
| address     | varchar(50)          | NO   |     |
+-------------+----------------------+------+-----+

這就是我試圖實現一對一關系的方式:

@Entity
@Table(name = "customer")
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int customer_id;

    @Basic
    private String first_name;

    @Basic
    private String last_name;

    @OneToOne(targetEntity = Address.class)
    @JoinColumn(name = "address_id")
    private Address address;

並在Address.java中

@Entity
@Table(name = "address")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int address_id;

    @Basic
    private String address;

    @OneToOne(mappedBy = "address", targetEntity = Customer.class)
    private Customer customer;

我正在用一個簡單的測試進行測試:

@Test
public void testGetAll() {
    PersistenceUtil.buildEntityManagerFactory();
    AddressDaoImpl addressDao = new AddressDaoImpl();
    List all = addressDao.getAll();
    System.out.println(all.iterator().next());
}

我得到:

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: address is not mapped [FROM address]

我究竟做錯了什么? 為什么不為客戶獲取地址實體?

編輯

這是我的DAO類的代碼:

package biz.tugay.saqila.dao;
/* User: koray@tugay.biz Date: 08/08/15 Time: 10:18 */

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import java.util.List;

public abstract class GenericDaoImpl<T> implements GenericDao<T> {

    @Override
    public List getAll() {
        EntityManager em = PersistenceUtil.getEntityManager();
        EntityTransaction transaction = em.getTransaction();
        transaction.begin();
        List<T> all = em.createQuery("FROM " + getTableName()).getResultList();
        transaction.commit();
        return all;
    }

}

public class AddressDaoImpl extends GenericDaoImpl<Address> {
    @Override
    public String getTableName() {
        return "address";
    }
}

JPQL(HQL)類和屬性名稱區分大小寫 因此,在查詢中,必須為Address實體使用正確的類名:

from Address ...

因此,將實體名稱固定為以大寫字母A開頭:

public class AddressDaoImpl extends GenericDaoImpl<Address> {
    @Override
    public String getTableName() {
        return "Address";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM