问:JPA save()保存其他对象

时间:2018-11-06 15:09:46

标签: java spring jpa kotlin spring-data-jpa

我想知道JAP Repotitoty的详细信息。 我创建了一个服务类,完整性类和存储库类,如下所示(用Kotlin编写),并执行了ItemService#update方法。

在执行item2Repository的save()方法时,item1和item2均已更新。

@Service
class ItemService(@Autowired private val item1Repository: Item1Repository, @Autowired private val item2Repository: Item2Repository) {

    fun update(id: Long) {

        val item1 = item1Repository.findById(1).get()
        item1.name = "updated!"

        val item2 = item2Repository.findById(1).get()
        item2.name = "updated!"

        // item1 and item2 were updated.
        item2Repository.save(item2)
    }
}


@Entity
@Table(name = "item1")
data class Item1(

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        val id: Long = 0,

        @Column
        var name: String = ""
)    

@Entity
@Table(name = "item2")
data class Item2(

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        val id: Long = 0,

        @Column
        var name: String = ""
)

interface Item1Repository: JpaRepository<Item1, Long>

interface Item2Repository: JpaRepository<Item2, Long>

为什么更新了item1? 我认为在执行findById方法时,在持久化上下文中都对item1和item2进行了管理。 当我执行jpa信息库的save方法时,是否会保存持久化上下文中存在的所有对象?

1 个答案:

答案 0 :(得分:2)

由于它是“托管”实例,因此您不必调用save即可保存它-对托管实例所做的所有更改都将反映在数据库中。 为了防止这种行为,您将不得不分离该实例,使其表现得像代理代理的POJO。

保存用于persist个新实体或merge分离的实体。