【问题标题】:Shared primary key generation. Hibernate共享主键生成。休眠
【发布时间】:2014-02-26 01:42:49
【问题描述】:

我在生成具有使用共享主键的一对一关系的主键时遇到问题。

代码如下:

@Entity
@Table(name = "osoba")
public class Osoba implements Serializable
{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "osoba_id")
    private Integer osobaId;

    @PrimaryKeyJoinColumn
    @OneToOne(cascade = CascadeType.PERSIST)
    public Pracownik pracownik;
...

二等:

@Entity
@Table(name = "pracownik")
public class Pracownik
{ 
    @OneToOne
    @JoinColumn(name = "osoba_id")
    @MapsId("osobaId")
    private Osoba osoba;

    @Id
    @Column(name = "osoba_id")
    private Integer osobaId;
...

我也遇到过类似的问题,我认为我做的一切都是正确的,但我仍然得到了

org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): entity.Pracownik

当试图持久化 Pracownik 对象时。

【问题讨论】:

    标签: java hibernate primary-key generator shared-primary-key


    【解决方案1】:

    您需要遵循@MapsId documentation 中的示例(在您的情况下,使用@Id 而不是@EmbeddedId):

    @Entity
    @Table(name = "pracownik")
    public class Pracownik {
        @Id 
        @Column(name = "oboba_id")
        private Integer id;
    
        @OneToOne
        @MapsId
        private Osoba osoba;
    
        ...
    }
    

    @OneToOne 关系的反面应该映射到mappedBy,通常:

    @Entity
    @Table(name = "osoba")
    public class Osoba implements Serializable {
        ...
        @OneToOne(mappedBy = "osoba", cascade = CascadeType.PERSIST)
        public Pracownik pracownik;
        ...
    }
    

    【讨论】:

    • 对不起,我忘了把ID为Pracownik的部分代码粘贴进去。现在它被编辑了。我还将@PrimaryKeyJoinColumn 替换为mappedBy = "osoba"。但错误依然存在。
    【解决方案2】:

    这个老问题,但对我有用。也许它会帮助某人。

    SQL 脚本 (Oracle)

    DROP TABLE HIBERNATE.PRACOWNIK;
    DROP TABLE HIBERNATE.OSOBA;
    DROP SEQUENCE HIBERNATE.OSOBA_SEQ;
    
    CREATE TABLE HIBERNATE.OSOBA (
    osoba_id                                NUMBER(15),
    CONSTRAINT OSOBA_PK PRIMARY KEY (osoba_id)
    );
    
    CREATE TABLE HIBERNATE.PRACOWNIK (
        pracownik_id                                NUMBER(15),
        CONSTRAINT PRACOWNIK_PK PRIMARY KEY (pracownik_id),
        CONSTRAINT PRACOWNIK_FK FOREIGN KEY (pracownik_id) REFERENCES OSOBA(osoba_id)
    );
    
    CREATE SEQUENCE HIBERNATE.OSOBA_SEQ START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;
    

    Osoba.java

    @Entity
    @Table(name = "osoba")
    public @Data class Osoba {
    
        @Id
        @Column(name = "osoba_id")
        @GeneratedValue(generator="osoba-generator", strategy = GenerationType.SEQUENCE)
        @SequenceGenerator(name="osoba-generator", allocationSize = 1, sequenceName = "OSOBA_SEQ")
        private Long osobaId;
    
        @OneToOne(fetch=EAGER, mappedBy="osoba", cascade=ALL)
        private Pracownik pracownik;
    }
    

    Pracownik.java

    @Entity
    @Table(name="pracownik")
    public @Data class Pracownik {
    
        @Id
        @Column(name = "pracownik_id")
        @GeneratedValue(generator="pracownik-generator")
        @GenericGenerator(name="pracownik-generator", strategy="foreign", parameters=
            @Parameter(name = "property", value = "osoba")
        )
        private Long pracownikId;
    
        @OneToOne(fetch=FetchType.EAGER)
        @PrimaryKeyJoinColumn
        private Osoba osoba;
    
    }
    

    @DataLombok

    【讨论】:

      猜你喜欢
      • 2014-03-27
      • 1970-01-01
      • 2018-02-11
      • 2017-12-06
      • 2020-08-03
      • 2015-06-18
      • 2012-03-21
      • 2012-03-15
      • 1970-01-01
      相关资源
      最近更新 更多