簡體   English   中英

如何使用單表策略創建外鍵

[英]How to create a foreign key using single table strategy

我有兩個實體UserPartnerPartner實體擴展了User

我正在使用單表策略,因此在數據庫中, User是將要創建的唯一表。

我還有另一個實體Doc ,該實體與Partner實體具有ManyToOne關系。

因此,我想在我的應用程序午餐時在數據庫UserDoc創建兩個表時,該表Doc將具有一個外鍵引用User表的PK,但它不執行此操作,而是僅創建一個列但沒有參考碼。

文件

@Entity
public class Doc implements Serializable {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String path;
    @Column(name="CREATION_TS", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP", insertable=false, updatable=false)
    private Calendar dateUploaded;

    @ManyToOne
    private Partenaire partenaire;

    public Doc(Document type, String name, String path, Calendar dateUploaded) {
        this.type = type;
        this.name = name;
        this.path = path;
        this.dateUploaded = dateUploaded;
    }

    //setters/getters

    @JsonIgnore
    @XmlTransient
    public Partenaire getPartenaire() {
        return partenaire;
    }

    @JsonSetter
    public void setPartenaire(Partenaire partenaire) {
        this.partenaire = partenaire;
    }
}

Partenaire

@Entity
@DiscriminatorValue("UP")
@XmlType(name = "UP")
public class Partenaire extends User implements Serializable {

//properties

@OneToMany(mappedBy="partenaire")
    private Collection<Doc> docs;

public Collection<Doc> getDocs() {
        return docs;
    }

    public void setDocs(Collection<Doc> docs) {
        this.docs = docs;
    }

}

用戶

@Entity
@Table(name="users")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE_USER",discriminatorType=DiscriminatorType.STRING,length=2)

@XmlSeeAlso({Candidat.class, Partenaire.class})
public class User implements Serializable {
@Id
private String username;
//properties ... 

}

我該如何解決?

編輯:

這是我的表結構:

-- phpMyAdmin SQL Dump
-- version 4.5.1
-- http://www.phpmyadmin.net
--
-- Host: 127.0.0.1
-- Generation Time: May 27, 2016 at 12:52 PM
-- Server version: 10.1.9-MariaDB
-- PHP Version: 5.6.15

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: `db_myfme`
--

-- --------------------------------------------------------

--
-- Table structure for table `doc`
--

CREATE TABLE `doc` (
  `id` bigint(20) NOT NULL,
  `creation_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `name` varchar(255) DEFAULT NULL,
  `path` varchar(255) DEFAULT NULL,
  `username` varchar(255) DEFAULT NULL,
  `type` bigint(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `doc`
--
ALTER TABLE `doc`
  ADD PRIMARY KEY (`id`),
  ADD KEY `FK_getdvvdhvurquqocgh0i9cdgl` (`type`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `doc`
--
ALTER TABLE `doc`
  MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
--
-- Constraints for dumped tables
--

--
-- Constraints for table `doc`
--
ALTER TABLE `doc`
  ADD CONSTRAINT `FK_getdvvdhvurquqocgh0i9cdgl` FOREIGN KEY (`type`) REFERENCES `document` (`code_document`);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

由於創建了單獨的partenaire類並將其注釋為@Entity,因此除非您分別命名該表,否則它將創建一個新表“ Partenaire”。 我認為這不是您的意圖,因為您已經有一個表“ User”。 我想,您希望做的是從“ Doc”類中將User稱為Partenaire:

@ManyToOne
private User partenaire;

並且(在用戶類別中):

@OneToMany(mappedBy="partenaire")
private Collection<Doc> docs;

如果您在控制器中正確實現了這一點,那么我認為您的問題將得到解決。。當然,除非另有理由為partenaire設置單獨的類?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM