我尝试使用springboot和h2数据库设置基本持久层。因为我之前从未使用过非基于查询的数据库,所以我觉得它很混乱。我在ManyToOne关系中创建了2个实体。
@Entity
@Table(name = "object_data")
public class ObjectData {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "path")
private String path;
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "object")
private List<UnitData> units;
public Long getId() {
return id;
}
public void setId(Long mId) {
id = mId;
}
public String getPath() {
return path;
}
public void setPath(String mPath) {
path = mPath;
}
public String getName(){
return name;
}
public void setName(String mName){
name = mName;
}
public List<UnitData> getUnits(){
return units;
}
public void setUnits(List<UnitData> mUnits){
units=mUnits;
}
}
子实体:
@Entity
@Table(name = "units_data")
public class UnitData {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "path")
private String path;
@Column(name = "name")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "objectdata_id")
private ObjectData object;
public Long getId() {
return id;
}
public void setId(Long mId) {
id = mId;
}
public String getName() {
return name;
}
public void setName(String mName) {
name = mName;
}
public String getPath() {
return path;
}
public void setPath(String mPath) {
path = mPath;
}
public ObjectData getObject() {
return object;
}
public void setObject(ObjectData mObject) {
object = mObject;
}
}
简单DAO:
@Repository
public class ObjectDAOH2 implements ObjectDAO {
@PersistenceContext
private EntityManager entityManager;
@Override
public void create(ObjectData object) {
entityManager.persist(object);
}
@Override
public void update(ObjectData object) {
entityManager.merge(object);
}
@Override
public ObjectData getById(Long id) {
return entityManager.find(ObjectData.class, id);
}
@Override
public void delete(Long id) {
ObjectData data = getById(id);
if (data != null)
entityManager.remove(data);
}
}
服务:
@Service
@Transactional
public class ObjectDataService {
@Autowired
private ObjectDAO dao;
public void create(ObjectData data){
dao.create(data);
}
public void update(ObjectData data){
dao.update(data);
}
public ObjectData getById(Long id){
return dao.getById(id);
}
public void delete(Long id){
dao.delete(id);
}
}
然而,在我创建对象之后,我仍然必须手动调用更新才能更新,如果我必须在每次更改后手动调用更新,使用此模型有什么好处?此外,两个模式都会出现,但即使在手动更新后也没有添加子对象,为什么会这样呢?
答案 0 :(得分:0)
数据层返回的对象是数据库实体的即时副本。
您仍然需要调用update
(在您的服务上)来提交对数据库的更改。
你应该知道,你在任何时候在线程中使用的每个对象都可能(并且最好总是将其视为 IS )与数据库中存储的不同。
答案 1 :(得分:0)
如果使用CrudRepository
,则不必编写太多代码import org.springframework.data.repository.CrudRepository;
public interface CustomerRepository extends CrudRepository<Customer, Long> {
List<Customer> findByLastName(String lastName);
}
参考示例:https://spring.io/guides/gs/accessing-data-jpa/
例1.1。 CrudRepository接口
public interface CrudRepository<T, ID extends Serializable>
extends Repository<T, ID> {
(1)
<S extends T> S save(S entity);
(2)
T findOne(ID primaryKey);
(3)
Iterable<T> findAll();
Long count();
(4)
void delete(T entity);
(5)
boolean exists(ID primaryKey);
(6)
// … more functionality omitted.
}
1
保存给定的实体。
2
返回由给定id标识的实体。
3
返回所有实体。
4
返回实体数量。
五
删除给定的实体。
6
指示是否存在具有给定id的实体。
++良好的查询功能。例如,findByLastNameAndFirstName()搜索两个字段。这种支撑由JPA弹簧开箱提供。
@Transactional还为JPA提供事务支持,如果出现故障,将恢复完整的事务。