![](/img/trans.png)
[英]Hibernate is generating the same foreign key constraint multiple times with inheritance strategy SINGLE_TABLE
[英]How to create a foreign key using single table strategy
我有兩個實體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;
}
}
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.