(1)首先看下代码:
public Long getServerIdBypublishWebsiteId(Long id) {
Site tempSite = entityManager.find(Site.class, id);
// Long serverId = (Long)entityManager.createQuery("SELECT s.serverId FROM Site s WHERE s.id= "+id).getSingleResult();
if (tempSite != null && tempSite.getServerId() != null) {
return tempSite.getServerId();
} else {
return null;
}
}
(2) Site tempSite = entityManager.find(Site.class, id);这种方式是通过主键来查找类的形式,一般情况下是这样用的。所以一般情况下如果知道主键的ID就应该先想到这种方式来查找类。
(3) Long serverId = (Long)entityManager.createQuery("SELECT s.serverId FROM Site s WHERE s.id= "+id).getSingleResult();
这种查询方式不适合用于主键的查询。至少我就在此碰到了错误:
错误场景的描述:
我在site list的页面,当我点击delete的链接时,它删除成功了,但是页面却没有及时的更新即数据库中的这条记录已经删除了,而页面中这条记录还存在。所以当然啦这个主键的ID就依然存在。
在删除这个数据之后它还会跳到本页面中,而这个时候(因为在本页面中它会去调用getServerIdBypublishWebsiteId这个方法),如果用Long serverId = (Long)entityManager.createQuery("SELECT s.serverId FROM Site s WHERE s.id= "+id).getSingleResult();这种形式的话,页面就会报错。
原因在什么地方呢?
此时的id是有值的,但是不要忘记了数据库中是没有值的,恰在此时你要去调用getSingleResult,这个肯定会报错啦。原因就是这个。
但是如果用Site tempSite = entityManager.find(Site.class, id);的话,就不会报错,虽然这个id是有值的,但是它从数据库里一查找这个Site的对象却没有发现,所以tempSite就是个空值,这样就不会报错的在页面中。
(4)所以以后如果有主键最好是想到那个find方法。
分享到:
相关推荐
EntityManager提供了一些方法来管理实体,如`persist()`用于保存新实体,`merge()`用于更新现有实体,`remove()`用于删除实体,以及`find()`用于根据主键查找实体。 **4. 查询** Hibernate EntityManager支持JPA的...
这些类需要使用`@Entity`注解来标识,并且通常有一个与表的主键对应的字段,使用`@Id`注解。例如: ```java @Entity public class User { @Id private Long id; private String name; // getters and setters }...
3. **实体定义**: 使用@Entity注解标记实体类,@Table指定对应的数据库表,@Id定义主键,其他属性用@Column注解。 4. **实体管理工厂**: 通过EntityManagerFactory创建EntityManager实例,它是操作实体的主要接口。...
2. 创建`persistence.xml`配置文件,定义数据源、实体类和持久化配置。 3. 在代码中通过`Persistence.createEntityManagerFactory()`创建实体单元实例。 ### 2. 服务器属性设置 在`persistence.xml`中,可以配置...
例如,我们可以使用JPQL来查找所有年龄大于25岁的人员: ```java String query = "SELECT p FROM Person p WHERE p.age > :age"; List<Person> personsOver25 = entityManager.createQuery(query, Person.class) ....
每个实体类通常有主键,用`@Id`注解标识。例如: ```java @Entity public class User { @Id private Long id; private String name; // getters and setters } ``` 2. **实体管理工厂...
3. **查找实体(Find)**: `EntityManager.find(Class entityClass, id)`方法根据实体类和ID来查找对应的实体,如果找不到则返回null。 4. **更新实体(Merge)**: `EntityManager.merge(entity)`将实体的最新状态...
它的核心概念包括实体(Entity)、实体类(Entity Class)、实体管理器(EntityManager)和实体管理工厂(EntityManagerFactory)。实体类通常对应数据库中的表,而实体管理器则负责执行CRUD操作。 在"jpatest"这个...
2. **实体类定义**:定义实体类,使用@Entity注解标记,@Table指定对应的数据库表,@Id标注主键字段。 3. **实体管理工厂**:通过Persistence.createEntityManagerFactory()获取EntityManagerFactory。 4. **操作...
例如,我们可以使用@Entity注解标记一个类作为实体,@Table注解指定对应的数据库表,@Id表示主键,@GeneratedValue指定主键生成策略。字段级别的注解如@Column用于字段到列的映射,@ManyToOne、@OneToMany等用于建立...
例如,调用`entityManager.persist(entity)`来保存新实体,`entityManager.find(Entity.class, id)`来查找特定ID的实体,`entityManager.createQuery(jpql)`来执行JPQL(Java Persistence Query Language)查询。...
此外,类的属性对应表的列,`@Id`注解表示主键字段,`@GeneratedValue`用于自动生成主键值。 JPA的核心组件包括: 1. **EntityManager**: 这是JPA的主要接口,负责与数据库进行交互,如保存、删除、查询实体。 2. *...
在JPA中,数据持久化主要通过实体类(Entity)、实体管理器(EntityManager)和实体管理工厂(EntityManagerFactory)来实现。首先,我们需要创建一个表示数据库表的实体类,通常会使用`@Entity`注解来标记这个类,...
6. **查询**:使用`entityManager.createQuery(jpqlString)`或`entityManager.createCriteriaBuilder()`创建并执行查询。 7. **关闭资源**:在完成操作后,记得关闭实体管理器和实体管理器工厂。 **JPA的优势:** ...
4.3 STATELESS SESSION BEAN与STATEFUL SESSION BEAN的区别...............................................................................22 4.4 如何改变SESSION BEAN的JNDI 名称...............................
创建实体类时,需要使用 JPA 注解来标记实体类、主键字段等。 **示例代码**: ```java @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private ...
`EntityManagerFactory`用于创建`EntityManager`实例,而`Persistence`类提供了静态方法来创建`EntityManagerFactory`。在应用的配置文件中,我们可以定义数据源和JPA供应商的相关配置。 ```java <provider>org....
List<MyEntity> entities = entityManager.createQuery("SELECT e FROM MyEntity e", MyEntity.class).getResultList(); ``` ### 3. 更新对象 #### 3.1 持久化状态 当实体处于持久化状态时,任何改变都会自动同步...
它是Java EE和Java SE环境中处理对象关系映射(ORM)的一种规范,旨在简化数据库操作,使得开发者可以使用面向对象的方式来处理数据库事务,而无需直接编写SQL语句。 **JPA核心概念** 1. **实体(Entity)**: 在...