關於hibernate對實體類主鍵生成策略的註解

現象描述:

在用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開始:

發佈了48 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章