Dev*_*abc 6 java dao hibernate jpa repository
dao/repository方法,实体对象或实体-id的参数类型的最佳实践是什么?
@Entity
class Product {
// ...
@ManyToOne
Seller seller;
}
@Entity
class Seller {
@Id @GeneratedValue
Long id;
}
class ProductDao {
// ...
// Using ids
public List<Product> getProductsOf(long sellerId) {
return getSession()
.createQuery("from Product where seller.id = ?")
.setLong(0, sellerId)
.list();
}
// Using object-references
public List<Product> getProductsOf(Seller seller) {
return getSession()
.createQuery("from Product where seller = ?")
.setEntity(0, seller)
.list();
}
// Using object-references using merge() on a detached object
public List<Product> getProductsOf2(Seller seller) {
Seller persistentSeller = getSession().merge(seller);
return getSession()
.createQuery("from Product where seller = ?")
.setEntity(0, seller)
.list();
}
// Using object-references using lock() on a detached object
public List<Product> getProductsOf3(Seller seller) {
getSession().buildLockRequest(LockOptions.NONE).lock(seller);
return getSession()
.createQuery("from Product where seller = ?")
.setEntity(0, seller)
.list();
}
}
Run Code Online (Sandbox Code Playgroud)
我发现了以下优点和缺点,但我想知道有经验的Spring/Hibernate/JPA用户是否有最佳实践.
getProductsOf(seller.getId())getProductsOf(seller)我正在使用getProductsOf(Seller seller),但必须验证卖家是处于持久状态还是处于分离状态是非常麻烦的.因此,我正在考虑使用ID.
最好的方法是避免编写自己的 DAO,而使用Spring Data。
我更喜欢 Spring Repository API,它看起来像这样:
public interface CrudRepository<T, ID extends Serializable>
extends Repository<T, ID> {
<S extends T> S save(S entity);
T findOne(ID primaryKey);
Iterable<T> findAll();
Long count();
void delete(T entity);
boolean exists(ID primaryKey);
}
Run Code Online (Sandbox Code Playgroud)
save方法delete采用一个实体findOne,exists因为它假设您没有要获取的实体至于findOne,最好让它带有一个标识符。这样即使你有一个实体也可以调用它。如果它是一个实体,那么您必须创建一个带有填充标识符的临时实体,只是为了获取关联的托管实体。