当前位置: 首页 > 知识库问答 >
问题:

未添加JPA一对一关系

凌钊
2023-03-14

我在数据库中有两个表一对一的关系:

CREATE  TABLE IF NOT EXISTS `toproject`.`osoby` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `imie` VARCHAR(45) NOT NULL ,
  `nazwisko` VARCHAR(45) NOT NULL ,
  `pesel` VARCHAR(11) NOT NULL ,
  `telefon` VARCHAR(45) NULL ,
  `pensja` VARCHAR(45) NULL ,
  `typ` VARCHAR(45) NOT NULL ,
  `stanowisko_id` INT NULL ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `pesel_UNIQUE` (`pesel` ASC) ,
  INDEX `fk_osoby_stanowiska_idx` (`stanowisko_id` ASC) ,
  CONSTRAINT `fk_osoby_stanowiska`
    FOREIGN KEY (`stanowisko_id` )
    REFERENCES `toproject`.`stanowiska` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `toproject`.`adresy` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `ulica` VARCHAR(45) NOT NULL ,
  `miejscowosc` VARCHAR(45) NOT NULL ,
  INDEX `fk_adres_osoby1_idx` (`id` ASC) ,
  PRIMARY KEY (`id`) ,
  CONSTRAINT `fk_adres_osoby1`
    FOREIGN KEY (`id` )
    REFERENCES `toproject`.`osoby` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

我必须使用@inherity(strategy=inheritancetype.single_table)来编写Java实体类:

@Entity
@Table(name = "osoby")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="typ", discriminatorType=DiscriminatorType.STRING)
public class Osoba implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "imie")
    private String imie;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "nazwisko")
    private String nazwisko;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 11)
    @Column(name = "pesel")
    private String pesel;

客户端类:

@Entity
@DiscriminatorValue(value = "Klient")
public class Klient extends Osoba {

    @Size(max = 45)
    @Column(name = "telefon")
    private String telefon;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "osobyId")
    private Collection<Zamowienie> zamowienieCollection;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "klient")
    private Adres adres;

占有实体:

@Entity
@Table(name = "adresy")
public class Adres implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "ulica")
    private String ulica;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "miejscowosc")
    private String miejscowosc;
    @JoinColumn(name = "id", referencedColumnName = "id", insertable = false, updatable = false)
    @OneToOne(optional = false)
    private Klient klient;

我有一个klientMB,它添加了人和地址

@ManagedBean
@RequestScoped
public class KlientMB {

    @EJB
    private KlientDaoLocal klientDao;
    private Klient klient;

    public KlientMB() {
    }

    public Klient getKlient() {
        if (klient == null) {
            klient = new Klient();
            Adres adres = new Adres();
            klient.setAdres(adres);
            adres.setOsoba(klient);
        }
        return klient;
    }

    public void setKlient(Klient klient) {
        this.klient = klient;
    }

    public String createKlient() {
        klientDao.create(klient);
        return "klienci.xhtml?faces-redirect=true";

    }

但是当我尝试添加一个Klient时,我出现了这个错误:

共有1个答案

益富
2023-03-14

我认为问题在于您使用toproject.adresy表中的id(主键)列作为外键连接到toproject.osoby。您应该引入一个新列(例如osoby_id)作为外键列,以连接到toproject.osoby。当前发生的情况是,ADRES表的id被用来在OSOBY表中查找记录,但没有记录。

 类似资料:
  • 问题内容: 我有一对一的关系,但是hibernatetool在生成模式时抱怨。这是显示问题的示例: 人与OtherInfo具有一对一关系: 人是OtherInfo的拥有方。OtherInfo是拥有方,因此person用于在Person中指定属性名称“ otherInfo”。 使用hibernatetool生成数据库架构时出现以下错误: 知道为什么吗?我是在做错什么还是这是Hibernate错误?

  • 我知道懒加载是做不到的,如果你在一对一的关系中有双向的关系。 所以我读了一篇关于如何使JPA OneToOne关系变懒的文章。 文章说你不能在一对一的关系中创建代理,但我不太理解。 我觉得多对一的关系和一对一的关系没有什么区别。他说,在多对一的关系中,您可以创建一个代理,因为您可以从fk获得值。 我觉得这两个是不一样的。我知道PK值相等,那么为什么不只有一对一的关系做懒加载呢?

  • 问题内容: 也许这是一个愚蠢的问题,但这困扰了我。 我有一个从员工到车辆的双向一对多关系。当我第一次将Employee保留在数据库中时(即它没有分配的ID),我也希望保留其关联的Vehicles。 目前,这对我来说很好,除了我保存的Vehicle实体没有自动映射关联的Employee,并且在数据库中Vehicle表中的employee_id外键列为空。 我的问题是,是否可以在雇员本身被保留的同时保

  • 问题内容: 是否可以在JPA的一对一关系的两边使用@JoinColumn?我的印象是,应该始终在一对一关系的拥有方中使用它,因为拥有方将具有外键列,并且此注释定义了外键列的属性。请说明我的理解是否正确。 编辑#1- 我想知道,在哪种情况下我们将在一对一关系的两边都使用@JoinColumn批注? 问题答案: OneToOne关系不一定是双向的。当在源对象和目标对象中都存在对该关系的另一个对象的引用

  • 问题内容: 我想在两个实体(消费者和政策)之间建立一对多关系。一个消费者应该有几项政策。 这是我希望拥有的Consumer JSON对象的示例: 这是我到目前为止所拥有的: 政策实体 消费者实体 我认为这并不难,但是我现在尝试了几个小时而无法完成。我是Spring的新手,所以如果有人能够帮助我,我将非常感激! 问题答案: @Entity public class Consumer { 不是必需的,