【问题标题】:How to create a foreign key using single table strategy如何使用单表策略创建外键
【发布时间】:2016-05-27 09:36:39
【问题描述】:

我有两个实体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;
    }
}

合作伙伴

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

【问题讨论】:

  • 哪个 JPA 实现?因为有些确实会创建 FK
  • @BillyFrost 是的,我正在使用 Spring Data Jpa,但它只创建没有外键的字段
  • Spring Data JPA 不是 JPA 实现。 JPA 实现类似于 DataNucleus、EclipseLink、Hibernate、OpenJPA。
  • 你不应该在一个类中使用 XML 和 JPA 注释。

标签: hibernate jpa spring-data spring-data-jpa


【解决方案1】:

由于创建了一个单独的partenaire 类并将其注释为@Entity,它将创建一个新表“Partenaire”,除非您单独命名该表。我认为这不是你的意图,因为你已经有一个表“用户”。 我假设您希望做的是将用户称为“Doc”类中的partenaire:

@ManyToOne
private User partenaire;

和(在用户类中):

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

如果您在控制器中正确实现此功能,我认为您的问题将得到解决。 当然,除非还有其他理由为partenaire 单独开设一个班级?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 2012-12-04
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多