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

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 に答える
1

エラーメッセージは掘り続けるのに十分な情報を提供します:

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

それは主キーまたは一意のキー制約のいずれかであり、マッピングによって示される一意の制約(およびマッピング自体に問題がないという事実)を考えると、それは一意であると推測しますnomeフィールドなどのキー制約違反。しかし、エラー メッセージはさらに何かを教えてくれます。それは、違反している制約の名前です: SQL131102225757700. したがって、この制約が適用される列を特定する必要があります。そうすれば、エラーの特定にかなり近づくと思います。(これを行う正確な方法は、データベース プロバイダーによって異なります。Google で検索してください。)

于 2013-11-03T17:36:19.350 に答える