2014-01-24 41 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(); 

    } 
} 
}