- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是我第一次使用 Hibernate,当我在循环中插入多行时,hibernate 会为插入的每一行打印出以下内容
Hibernate: select nextval ('hibernate_sequence')
在它对循环中的所有数据执行此操作后,它开始插入数据
Hibernate: insert into user_data (age, location, sent_count, user_id, username, id) values (?, ?, ?, ?, ?, ?)
hibernate 总是这样运作的吗?数据库不可能处理序列吗?我觉得这确实减慢了插入行的过程。我正在为我的数据库使用 PostgreSQL。
这是我的相关代码用户数据
@Entity
@Table(name = "user_data")
public class UserData
{
@Id @GeneratedValue
@Column(name = "id")
private int id;
@Column(name = "user_id")
private String userid;
@Column(name = "username")
private String username;
@Column(name = "age")
private int age;
@Column(name = "location")
private int location;
@Column(name = "sent_count")
private int sentCount;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getUserid()
{
return userid;
}
public void setUserid(String userid)
{
this.userid = userid;
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public int getLocation()
{
return location;
}
public void setLocation(int location)
{
this.location = location;
}
public int getSentCount()
{
return sentCount;
}
public void setSentCount(int sentCount)
{
this.sentCount = sentCount;
}
}
我的 Hibernate 助手类
public class HibernateUtil
{
static SessionFactory sessionFactory;
static ServiceRegistry serviceRegistry;
static
{
try
{
Configuration configuration = new Configuration();
configuration.setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false");
configuration.configure();
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
catch (Throwable ex)
{
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
closeSessionFactory();
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory()
{
return sessionFactory;
}
public static void closeSessionFactory()
{
sessionFactory.close();
}
}
和插入行的相关部分
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
for (String memberId : memberIds)
{
System.out.println(memberId);
UserData user = new UserData();
user.setUserid(memberId);
session.save(user);
}
session.getTransaction().commit();
session.close();
HibernateUtil.closeSessionFactory();
最佳答案
当您调用 session.save()
时,您还没有向数据库中插入任何内容。您只是将对象注册到 session 缓存,Hibernate 会在其中跟踪最终需要在数据库中插入/更新的所有对象。但是 Hibernate 立即需要的是新对象的标识符,因此它可以连接通过外键引用它的其他对象。
默认情况下,Hibernate 将使用一个由本地数据库序列支持的简单的 ID 生成器,从该序列中为每个保存的对象获取一个 ID。只要您不进行批量插入(在同一事务中插入很多东西),这就可以正常工作。不过,您的 for 循环确实使它看起来就像您正在做的那样。
如果您在执行批量插入时需要良好的性能,则需要处理一些问题(四处搜索),但在这里我将针对您的紧迫问题提供解决方案:优化序列生成器。这是我使用的:
@GenericGenerator(name = "optimized-sequence", strategy = "enhanced-sequence", parameters = {
@Parameter(name = "prefer_sequence_per_entity", value = "true"),
@Parameter(name = "optimizer", value = "hilo"),
@Parameter(name = "increment_size", value = "50") })
package org.example.myproject;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
以上内容必须保存在名为package-info.java
的文件中。它实现的是在名称 optimized-sequence
下定义一个包范围的自定义 ID 生成器。你可以像这样使用它:
@Id @GeneratedValue(generator = "optimized-sequence") public long id;
这将为您购买一个本地序列支持的 ID 生成器,但它只需要为每 50 个(可配置的)保存对象碰撞数据库序列一次。它改变了底层序列的语义,例如,currval = 1
表示当前 Hibernate session 为自己保留了 ID 范围 1-50。是的,这会在您的 ID 空间中产生“漏洞”,但是由于要绕过 264,您不应该很快开始担心这个问题。
关于java - 为使用 hibernate 插入的每一行选择 nextval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26982990/
我有一个这样声明的表列: file_id number(10) generated always as identity primary key, 是否有可能以编程方式获得 currval/nextv
基本上,我需要从一个序列中查询大约一千个 NEXTVAL。我可以循环查询它们,或者我可以通过与一个非常大的表的连接来查询它们。 有没有更简单的方法? 更新。 基本上,我有一个对对象的操作计划。每个对象
我正在使用 oracle 数据库并面临一个问题,其中两个 id_poduct.nextval 创建为错误:ORA-00001:违反唯一约束 (SYSTEM.SYS_C004166) 这是一个主键。使用
我正在使用 oracle 数据库并面临一个问题,其中两个 id_poduct.nextval 创建为错误:ORA-00001:违反唯一约束 (SYSTEM.SYS_C004166) 这是一个主键。使用
实际上我们对一些方法使用了 @Transactional(readOnly=true) 但这些方法以某种方式执行 nextVal() 这对其他数据库来说很好但是在 Postgres 9.6.3 上它会
我需要能够生成运行查询,该查询将返回下表中的ID的下一个值: CREATE TABLE animals ( id MEDIUMINT NOT NULL AUTO_INCREMENT,
我需要增加我的 ID。我必须通过在 oracle 数据库中使用序列来增加。当我使用 INSERT INTO XXX (seq_xxx.nextval, ....) 时出现错误 invalid colu
我想创建一个可以直接复制到 MS Excel 中的模板(通过 SQL)。 总的来说,这很顺利,但是,我遇到了应该存储 Excel 公式的字段的问题。根据用户在 Excel 工作表列之一中的输入,该字段
我的应用程序中有这个 SQL 脚本: select my_seq.nextval from dual connect by level <= 100; 它工作得很好,但是一旦我看到(在日志中)它根本没
我正在使用 spring jdbctemplate 将行插入 mysql 数据库,在批量插入 mysql 数据库时遇到问题。问题是,插入第二行时,我的主键出现重复键冲突。我已将 USER_KEY 放入
我已经寻找并没有找到这个问题的答案: 我使用嵌套选择插入一行,但还需要 uid 序列和日期戳 SQL 插入 insert into countdegreejob (countdegreeid,j
我正在测试 postgresql 序列(使用 http://sqlfiddle.com 和 PostgreSQL 9.3 我目前没有在本地设置 PostgreSQL),但我看到了奇怪的行为。 创建一个
我有一个有维护菜单的应用程序(当然只在极少数情况下使用)。在此菜单中,我还显示了某个序列接下来将生成的下一个数字,并为用户提供了重置序列的选项。 我使用以下查询来显示下一个数字: select cas
我有以下 sql: INSERT INTO in_api_settings ( ENTITY_ID, ACTIVE_START_DATE, ACTIVE_END_DATE) VA
我有一个 PgSQL 9.4.3 服务器设置,之前我只使用公共(public)模式,例如我创建了一个这样的表: CREATE TABLE ma_accessed_by_members_tracking
我在模式中有一个关于 postgresql 9.3 的序列。 我能做到: SELECT last_value, increment_by from foo."SQ_ID";` last_value |
我尝试插入到以sequence .nextval为主键的表中,Java中的sql是 sql = "INSERT INTO USER (USER_PK, ACCOUNTNUMBER,
使用 SQLPlus,我生成了以下序列: CREATE SEQUENCE pubnum_seq START WITH 7 INCREMENT BY 2 MAXVALUE 1000; 我想要做的
如何在一次查询中两次选择相同的序列? 我已经用谷歌搜索了这个,只是无法得到答案。 为了清楚起见,这就是我需要的,例如: select seq.nextval as v1, seq.nextval as
我有以下 3 个表, 数据_Excel 包含姓名、地址、城市和人员来源; 人表 有姓名和身份证; 我需要插入 person_location 地址来源、地址、城市和ID... 我正在使用以下查询: C
我是一名优秀的程序员,十分优秀!