現象描述:
在用hibernate做練習的時候用的是註解的形式配置pojo, 在操作po的時候出現了在數據庫中插入數據主鍵不連續的現象,然後還發現數據庫中自動產生了一張
表,覺得很納悶兒,下面是插入操作的單元測試代碼:
import com.sunsharing.dao.impl.SomeBodyDaoImpl;
import com.sunsharing.po.Address;
import com.sunsharing.po.SomeBody;
import com.sunsharing.service.Person02Service;
import com.sunsharing.service.SomeBodyService;
import org.hibernate.Session;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.junit.*;
import java.util.Set;
/**
* Created by baich on 2016/2/19.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml", "classpath:spring-hibernate.xml", "classpath:mvc-dispatcher-servlet.xml"})
public class SomeBodyTest {
@Autowired
private SomeBodyService someBodyService;
@Autowired
private SomeBodyDaoImpl someBodyDaoImpl;
@Test
public void insert() {
Session session = someBodyDaoImpl.getSessionFactory().openSession();
session.beginTransaction();
SomeBody someBody = new SomeBody();
someBody.setUserName("yangbo");
someBody.setGender("male");
someBody.setAge(20);
Address address = new Address();
address.setAddressDetail("huangshi");
//address.setAddressId(50);
Address address02 = new Address();
address02.setAddressDetail("leshan");
//address02.setAddressId(51);
someBody.getAddresses().add(address);
someBody.getAddresses().add(address02);
session.persist(address);
session.persist(address02);
session.persist(someBody);
Address address03 = new Address();
address03.setAddressDetail("beijing");
//address03.setAddressId(52);
session.persist(address03);
someBody.getAddresses().add(address03);
session.getTransaction().commit();
session.close();
}
}
SomeBody和Address是一對多映射關係,關係由SomeBody控制,程序功能是先持久化兩個Address對象,然後將那兩個Address對象設爲SomeBody的Set<Address>屬性的值,然後將SomeBody對象持久化,然後再持久化一個Address對象並將該對象添加到Set<Address>,提交事物。
問題:
爲什麼記錄值不連續?
表的作用是什麼?
原因,及解決辦法:
經過同事幫助發現,原來如果實體類的主鍵生成策略註解成
@GeneratedValue(strategy = GenerationType.AUTO), 則主鍵由程序指定,故名思意,主鍵值由用戶在程序中指定,如果用戶不指定則由hibernate給自動指定,而hibernate的指定方式爲,利用在數據庫中自動生成的表,每次插入時根據中的記錄值創建下一個id值,所有實體共享一個連續的序列。產生開頭遇到的現象的原因是,插入前兩個Address記錄的時候是連續插入的(其間不涉及其他實體記錄的插入),所以id值是連續的(1, 2),第三次的插入操作是SomeBody實體的插入,序列值3就分配給了SomeBody記錄,然後再插入下一個Address對象時主鍵值就變成了4。
如果以後還有其他實體的記錄插入,主鍵值就從5開始: