[英]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.