【发布时间】:2014-05-12 07:14:48
【问题描述】:
对于我的桌面应用程序,我使用 JavaFX、Spring、JPA + Hibernate 和 PostgreSQL。目前我遇到了几个问题。
问题一:违反PRIMARY KEY约束SQL错误
当我按照以下方式(GenerationType 为 AUTO)创建实体类时,它可以正常工作。但是当我创建一个新的数据库并使用 sql 脚本添加一些测试数据(如下图所示)并尝试使用我的应用程序插入一些数据时,我遇到了“违反主键约束”的 SQL 错误。这意味着 Hibernate 似乎试图生成已经可用的 PK 值(与我的测试数据一起分配,例如 1、2、3 等)。但是经过 5 次尝试(超过了测试数据最大 pk 值)就可以了,开始插入 PK 键值为 6 的数据。
实体类 - GenerationType 为 AUTO
@Entity
@Table(name = "devicetype")
public class Devicetype implements Serializable {
@Id
@Basic(optional = false)
@Column(name = "id")
private Integer id;
}
带有初始测试数据的表格
EntityManager 工厂
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
<property name="packagesToScan" value="com.core.domain" />
<property name="jpaProperties">
<props>
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgresPlusDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.use_sql_comments">false</prop>
<prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
</props>
</property>
</bean>
问题二:序列值的差距
为了解决错误,我根据以下方式更改了实体类(GenerationType 为 SEQUENCE)并完成了相同的步骤(使用 sql 脚本插入初始测试数据并尝试通过应用程序插入数据)。然后数据被插入,没有任何异常。现在我的表包含通过脚本和应用程序插入的记录(如下图所示)。但是通过应用程序新添加的数据(我在浅蓝色上突出显示)具有非常高的 PK 值(从 184 开始,而不是从 6 开始)。这意味着“GenerationType as SEQUENCE”似乎休眠不按顺序填充 ID 值(保持一些间隙)。当我通过应用程序进一步添加一些数据时,它似乎会插入具有另一个更高 ID 值的数据(不是从 214 开始)。这意味着似乎 ID 没有按顺序递增。
实体类 - GenerationType 为 SEQUENCE
@Entity
@Table(name = "device_type")
public class DeviceType implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name="my_seq", sequenceName="MY_SEQ", allocationSize=1, initialValue=1)
@Basic(optional = false)
@Column(name = "ID")
private Integer id;
}
有间隙的表格数据(用于序列 ID)
【问题讨论】:
-
考虑将问题拆分为其他两个...
标签: java sql hibernate postgresql jpa