Как создать внешний ключ с помощью стратегии одной таблицы

У меня есть две сущности UserиPartner, Partnerсущность расширяется User.

Я работаю со стратегией одной таблицы, поэтому в базе Userданных единственная таблица, которая будет создана.

У меня есть другая сущность, которая естьDoc, эта сущность имеет ManyToOneотношение к Partnerсущности.

Поэтому я хочу, когда я обедаю мое приложение, чтобы создать две таблицы в базе Userданных иDoc, таблица Docбудет иметь, то внешний ключ ссылается на PK Userтаблицы, но он не делает этого, вместо этого он только создает столбец, но без ссылочного ключа.

Доктор

@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 */;

1 ответ

  1. После создания sepparate partenaire-class и аннотирования его как @ Entity, он создаст новую таблицу «Partenaire», если вы не назовете таблицу отдельно. Я думаю, что это не ваше намерение, потому что у вас уже есть таблица «пользователь».
    Что вы хотите сделать, я полагаю, это вызвать пользователя как partenaire из вашего » Doc » — класса:

    @ManyToOne
    private User partenaire;
    

    И (в пользовательском классе):

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

    Если вы правильно реализуете это в своем контроллере, я думаю, что ваша проблема будет решена..
    Если, конечно, нет другой причины сделать класс sepparate для partenaire?