我的最后一行代碼輸出“role111”(從資料庫中獲取的資料),但是在代碼執行后我在資料庫中有“role11”,那么為什么我有“role11”而不是“role111”?會話關閉之前role處于持久狀態,因此應與資料庫中的行連接并與之保持一致。也許持久狀態僅適用于事務內部,并且由于一級快取,最后一行代碼列印 role111。
@Entity
@Table(name = "roles")
public class Role
{
@Id
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
public Role()
{
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
Role role = new Role();
role.setId(1);
role.setName("role1");
SessionFactory sessionFactory = new Configuration().configure().addAnnotatedClass(Role.class).buildSessionFactory();
try (Session session = sessionFactory.openSession())
{
session.beginTransaction();
session.save(role);
role.setName("role11");
System.out.println(session.get(Role.class, 1).getName()); // prints role11
session.getTransaction().commit();
role.setName("role111");
System.out.println(session.get(Role.class, 1).getName()); // prints role111
}
這是我的資料庫
| ID | 姓名 |
|---|---|
| 1 | 角色11 |
uj5u.com熱心網友回復:
Hibernate 使用事務性寫入。Hibernate 會話存盤更新操作直到發生提交,此時操作以 Hibernate 認為最有意義的任何順序執行(而不是它們在您的代碼中出現的順序),這會導致 jdbc 更新處理在資料庫中。
將角色名稱設定為 role11 之后的提交會導致重繪 更新,從而成功保存名稱。由于您在角色名稱更改為 role111 之后沒有提交,因此沒有任何內容會導致運行更新操作。
您可以通過設定重繪 模式來更改提示更新運行的內容。如果不這樣做,Hibernate 的默認設定是在提交時重繪 ,除非 Hibernate 被用作 JPA 提供程式,在這種情況下,它也會在運行查詢時重繪 。
uj5u.com熱心網友回復:
資料尚未提交到資料庫。您需要再次呼叫 commit() 來撰寫它(我假設)。此外,有時 JPA 會在發出一批查詢之前緩沖資料。如果是這種情況,它會等待更多資料,然后才需要在突發中執行它們。如果要控制行程,可以session.flush()在最后一次呼叫后呼叫。
uj5u.com熱心網友回復:
您在問題標題中假設從資料庫加載資料是不正確的。資料是從 Hibernate 正在管理的當前背景關系加載的,這意味著您將看到資料在記憶體中的狀態,這并不意味著它已在資料庫中提交甚至更新。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/375400.html
上一篇:org.hibernate.search.SearchException:無法創建索引目錄:/data/index
下一篇:為什么在更新資料時插入資料
