gpt4 book ai didi

java - Hibernate 不使用定义的序列 (postgresql)

转载 作者:行者123 更新时间:2023-11-29 13:50:38 25 4
gpt4 key购买 nike

我正在尝试使用正确的 ID 将映射对象插入到 postgresql 数据库中。这是我插入的方式:

Session session = Main.getSession();
Transaction rx = session.beginTransaction();
ProductsEntity productsEntity = new ProductsEntity();
productsEntity.setName(nameTextField.getText());
productsEntity.setDescription(descriptionTextArea.getText());
productsEntity.setCategory((ProductCategoriesEntity) categoryComboBox.getSelectedItem());
productsEntity.setPrice(new BigDecimal(1.0));
session.save(productsEntity);
tx.commit();
session.close();

具有定义序列的类:

@Entity
@Table(name = "products", schema = "public", catalog = "shop")
public class ProductsEntity {
private int id;
private String name;
private String description;
private BigDecimal price;

@Id
@Column(name = "id", nullable = false)
@SequenceGenerator(name="pk_sequence",sequenceName="products_id_seq")
@GeneratedValue(strategy=GenerationType.AUTO,generator="pk_sequence")
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

@Basic
@Column(name = "name", nullable = false, length = -1)
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Basic
@Column(name = "description", nullable = false, length = -1)
public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

@Basic
@Column(name = "price", nullable = false, precision = 2)
public BigDecimal getPrice() {
return price;
}

public void setPrice(BigDecimal price) {
this.price = price;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

ProductsEntity that = (ProductsEntity) o;

if (id != that.id) return false;
if (name != null ? !name.equals(that.name) : that.name != null) return false;
if (description != null ? !description.equals(that.description) : that.description != null) return false;
if (price != null ? !price.equals(that.price) : that.price != null) return false;

return true;
}

@Override
public int hashCode() {
int result = id;
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (description != null ? description.hashCode() : 0);
result = 31 * result + (price != null ? price.hashCode() : 0);
return result;
}

private ProductCategoriesEntity category;

@ManyToOne
public ProductCategoriesEntity getCategory() {
return category;
}

public void setCategory(ProductCategoriesEntity category) {
this.category = category;
}
}

postgresql 序列 products_id_seq 的最后一个值为 4。Hibernate 正在插入 id=0 的对象,所以第一次插入是成功的,现在我遇到了唯一约束冲突。

编辑我通过添加生成器使序列工作

<generator class="identity"/>

在xml映射定义中

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="entities.ProductsEntity" table="products" schema="public" catalog="shop">
<id name="id">
<column name="id" sql-type="integer"/>
<generator class="identity"/>
</id>
<property name="name">
<column name="name" sql-type="varchar"/>
</property>
<property name="description">
<column name="description" sql-type="varchar"/>
</property>
<property name="price">
<column name="price" sql-type="numeric(9,2)" precision="9" scale="2"/>
</property>
<many-to-one name="category" column="category_id" class="entities.ProductCategoriesEntity" lazy="false"/>
</class>
</hibernate-mapping>

这不需要在类中定义顺序。我也尝试过使用

@GeneratedValue(strategy=GenerationType.IDENTITY)

在类文件中,但它不起作用。

如果有人有想法请告诉我为什么只有“xml”方法有效。

最佳答案

序列“products_id_seq”是数据库序列吗?

如果是,则将您的 GenerationTypeAuto 更改为 SEQUENCE
我对 Postgres 进行了类似的设置,并将 GenerationType 设置为 SEQUENCE并给予allocationSize = 1为我工作。

此外,请确保您的序列与表格保持同步。如果不是,请暂时更改顺序,以便您的进一步更新不会失败。

关于java - Hibernate 不使用定义的序列 (postgresql),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41665805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com