问题
dao/存储库方法的参数类型,实体对象或实体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();
}
}
利弊
我发现了以下优点和缺点,但是我想知道在经验丰富的Spring/Hibernate/JPA用户中是否存在最佳实践。
优点:getProductsOf(卖方)
缺点:getProductsOf(卖方卖方)
优点:getProductsOf(long SellerId)
缺点:getProductsOf(long SellerId)
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);
}
save
和delete
方法采用实体findOne
和exists
采用标识符,因为它假定您没有要获取的实体至于
findOne
,最好让它带有一个标识符。这样,即使您有实体,也可以调用它。如果它是一个实体,那么仅为了获取关联的受管实体,就必须创建一个具有填充标识符的临时实体。关于java - DAO方法参数,对象引用与ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28194683/