2

我的应用程序有一个具有此属性和 JPA 注释的实体类 (Ativo):

@JoinColumn(name = "BOLSA", referencedColumnName = "ID")
@ManyToOne(optional = false, cascade = {CascadeType.PERSIST})
private Bolsa bolsa;

当我尝试持久化实体类(Ativo)时,会引发此异常:

内部异常:java.sql.SQLIntegrityConstraintViolationException:该语句被中止,因为它会导致唯一或主键约束或由“BOLSA”上定义的“SQL131102225757700”标识的唯一索引中的重复键值。

我不明白我的代码有什么问题。如果这应该只是现有对象的外键,为什么还要尝试创建 Bolsa 类型的新对象?


Ativo 类的标题:

@Entity
@Table(name = "ATIVO")
public class Ativo implements EntityInterface<Ativo>, Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID")
    private Long id;

    @Basic(optional = false)
    @Column(name = "CODIGO", unique=true, nullable = false)
    private String codigo;

    @Basic(optional = false)
    @Column(name = "TIPO_MERCADO", nullable = false)
    private String tipoMercado;

    @Column(name = "DESCRICAO", nullable = false, length = 10000)
    private String descricao;

    @JoinColumn(name = "BOLSA", referencedColumnName = "ID")
    @ManyToOne(optional = false, cascade = {CascadeType.PERSIST})
    private Bolsa bolsa;

Bolsa 类的标题:

@Entity
@Table(name = "BOLSA")
public class Bolsa implements EntityInterface<Bolsa>, Serializable, Comparable<Bolsa> {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID")
    private Long id;

    @Basic(optional = false)
    @Column(name = "NOME", unique = true, nullable = false)
    private String nome;

    @Column(name = "DESCRICAO", nullable=false, length = 10000)
    private String descricao;
4

3 回答 3

4

错误消息很明确:您正在尝试插入id数据库中已经存在的行,因此会出现完整性约束违规(重复的主键)。

检查您的代码,设置 的部分id,并确保它使用唯一标识符。或者使用id字段中的注释每次自动生成一个新密钥。或者定义一个数据库序列来执行此操作。

于 2013-11-03T17:08:59.433 回答
1

错误消息为您提供了足够的信息来继续挖掘:

a duplicate key value in a unique or primary key constraint or unique index identified by 'SQL131102225757700'

它声明它是主键或唯一键约束,并且鉴于您的映射指示的唯一约束(以及我看不出映射本身有任何问题的事实),我猜它是唯一的键约束违反,例如nome字段。但是,错误消息给了我们更多的东西,那就是被违反的约束的名称:SQL131102225757700. 所以,你需要做的是弄清楚这个约束适用于哪一列,一旦你这样做了,我猜你会更接近于找出错误。(具体怎么做取决于你的数据库提供商,谷歌它..)

于 2013-11-03T17:36:19.350 回答
1

正如评论中所建议的,cascade = {CascadeType.PERSIST}从以下关系中删除将起作用。

@JoinColumn(name = "BOLSA", referencedColumnName = "ID")
@ManyToOne(optional = false, cascade = {CascadeType.PERSIST})
private Bolsa bolsa;

原因是,Cascade Persist 负责通过传递持久性为您将内容放入数据库,因此您不必显式地持久化父级(在您的情况下为“Bolsa”)。但是,在持久化之前维护对象的内存状态始终是您的责任。

我怀疑(因为从提供的片段中不清楚)您Bolsa在保存之前明确地持久化对象Ativo,因此通过删除级联持久性约束来解决异常。

于 2013-11-04T20:08:35.093 回答