【发布时间】:2016-05-27 09:36:39
【问题描述】:
我有两个实体User 和Partner,Partner 实体扩展了User。
我正在使用单表策略,因此在数据库中,User 是唯一将创建的表。
我有另一个实体 Doc,该实体与 Partner 实体有 ManyToOne 关系。
所以我想在我的应用程序午餐时在数据库User 和Doc 中创建两个表,然后表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