2014-01-24 42 views
0

我有一種情況,我需要保存一個hibernate對象,但我不知道是否將通過調用應用程序分配一個ID(使用範圍內的特殊邏輯 -​​ 唯一) 或不。休眠 - 自動或手動ID - 在集羣環境

如果ID未分配,我需要休眠來生成一個高於應用程序可能輸入的ID範圍(我知道範圍)的ID。否則應該使用應用程序輸入。

我對MySQL的工作 - 檢查,看看,如果我能像下面

public class MyDOIdGenerator extends IdentityGenerator{ 

    @Override 
    public Serializable generate(SessionImplementor session, Object obj) throws HibernateException { 
     if ((((MyDO) obj).getId()) == null) { 
      Serializable id = super.generate(session, obj) ; 
      return id; 
     } else { 
      return ((MyDO) obj).getId(); 

     } 
    } 
} 

但我的問題是,我不知道super.generate將如何表現在集羣環境中自定義的生成。它會保持跨服務器的ID同步嗎?我如何指定從開始的號碼? (因爲我需要有在使用ID範圍排除應用Hibernate來生成它)

請幫

感謝

回答

0

在DB,設置您的序列開始與特定號碼範圍(開始你所提到的),然後使用這樣的事情你ID的註釋,它將確保Hibernate會使用一個ID序列中,你將不必擔心羣集/非羣集環境問題:

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "id") 
private Long id; 
+0

謝謝,我的問題是兩個這裏1- MySQL的犯規支撐squences 2.我的DO對象既可以填充有預先定義的ID(續數據遷移&SYC通過來自不同系統的API調用大約一個月 - 這些調用帶有源系統中的id)。正常的API調用不帶有ID,系統應該識別並正確分配一個ID – user3233126

0

我終於實現了ED此使用表在數據庫如下

package com.yahoo.mb.do; 

import java.io.Serializable; 
import java.lang.invoke.MethodHandles; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.Calendar; 

import org.hibernate.HibernateException; 
import org.hibernate.engine.SessionImplementor; 
import org.hibernate.id.IdentityGenerator; 

import com.yahoo.sm.ads.common.log.Logger; 

public class MyDOGenerator extends IdentityGenerator{ 

private static final Class clazz = MethodHandles.lookup().lookupClass(); 
private static final Logger logger = Logger.getLogger(clazz); 

private static String selectQuery = "SELECT nextval FROM identity_value WHERE name='MY_DO' FOR UPDATE"; 
private static String updateQuery = "UPDATE identity_value SET nextval=?, last_updated=? WHERE name='MY_DO'"; 

@Override 
public Serializable generate(SessionImplementor session, Object obj) throws HibernateException { 
    if ((((MyDO) obj).getId()) == null) { 

     Connection connection = session.connection(); 
     try { 
      PreparedStatement selectStatement = connection.prepareStatement(selectQuery); 
      PreparedStatement updateStatement = connection.prepareStatement(updateQuery); 

      logger.info(clazz, "generate", "Generating nextval"); 
      ResultSet rs = selectStatement.executeQuery(); 

      if (rs.next()) { 
       Long id = rs.getLong("nextval"); 
       logger.info(clazz, "generate", "Generated nextval: " + id); 
       updateStatement.setLong(1, id+1); 
       updateStatement.setDate(2, new java.sql.Date(new java.util.Date().getTime())); 

       logger.info(clazz, "generate", "Updating nextval: " + id); 
       updateStatement.executeUpdate(); 
       return id; 
      } 
     } catch (SQLException e) { 
      logger.error(clazz, "generate", "Error generating ID" + e); 
      throw new HibernateException("Unable to generate MyDO id value"); 
     } 
     return null; 
    } else { 
     return ((MyDO) obj).getId(); 

    } 
} 
}