dao / repository方法,实体对象或entity-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(seller.getId())
getProductsOf(seller)
我正在使用getProductsOf(Seller seller)
,但必须验证卖家是处于持久状态还是处于分离状态是非常麻烦的。因此,我正在考虑使用ID。
答案 0 :(得分:2)
最好的方法是避免写下自己的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
,最好让它采用标识符。这样即使您有实体也可以调用它。如果它是一个实体,那么你必须创建一个带有填充标识符的瞬态实体,只是为了获取相关的管理实体。
答案 1 :(得分:1)
为什么不同时使用它们?
public List<Product> getProductsOf(long sellerId){
return getSession()
.createQuery("from Product where seller.id = ?")
.setLong(0, sellerId)
.list();
}
public List<Product> getProductsOf(Seller seller){
return getProductsOf(seller.getId());
}
另外,我更喜欢使用类而不是本机类型来表示id,因为这样你可以验证对象是否是新的(seller.getId()== null)并调用persist()或merge()