Springboot JPA会自动发生什么以及我自己编写代码?

时间:2017-05-29 13:10:01

标签: java jpa spring-boot

我尝试使用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);
    }
}

然而,在我创建对象之后,我仍然必须手动调用更新才能更新,如果我必须在每次更改后手动调用更新,使用此模型有什么好处?此外,两个模式都会出现,但即使在手动更新后也没有添加子对象,为什么会这样呢?

2 个答案:

答案 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弹簧开箱提供。

请参阅https://github.com/Roshanmutha/rcmutha-springdatarepository/blob/master/src/main/java/com/rcmutha/springjpa/Application.java

框下的CRUD操作

请参阅https://github.com/Roshanmutha/rcmutha-springdatarepository/blob/master/src/main/java/com/rcmutha/springjpa/service/CustomerRepository.java

上的查询功能

@Transactional还为JPA提供事务支持,如果出现故障,将恢复完整的事务。