[英]Hibernate, Use a constant in a many to many join
我有一個多對多的連接,我試圖在Hibernate中使用下表;
CREATE TABLE media (
id INTEGER NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL ,
file longblob COMMENT 'Content of the file if it is embedded',
PRIMARY KEY (id)
) DEFAULT CHARSET=utf8;
CREATE TABLE media_reference (
id INTEGER NOT NULL AUTO_INCREMENT,
media_id INTEGER NOT NULL COMMENT 'ID of the media',
reference_id INTEGER DEFAULT NULL,
reference_type VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (id)
) DEFAULT CHARSET=utf8;
CREATE TABLE people (
id INTEGER NOT NULL AUTO_INCREMENT,
name VARCHAR(250) NOT NULL,
reference_type VARCHAR(40) DEFAULT 'People',
PRIMARY KEY (id)
) DEFAULT CHARSET=utf8;
基本上,人們記錄可以鏈接到許多媒體記錄,並且媒體記錄可以鏈接到許多人的記錄。
我在'media_reference'表中使用了'reference_type'字段來存儲該關系所屬的表的名稱,因為我希望能夠使用相同的機制將媒體記錄與其他表中的記錄相關聯。 reference_type和reference_id的組合用於獲取media_reference記錄。
我花了幾天的時間繞圈子嘗試各種各樣的方法讓它發揮作用。 我對Hibernate很新,所以我甚至不確定要問什么問題,因此我需要花費很多時間才能找到前進的方向。
下面的代碼盡可能地符合我的要求。 我可以在更新或創建媒體記錄時將其添加到人員記錄中。 我不喜歡代碼的是需要在people表中有一個reference_type字段。 這是因為它總是相同但我無法通過任何其他方式將表的名稱輸入media_reference.reference_type字段。
理想情況下,在PeopleEntity類的@ManyToMany注釋中,我可以為reference_type @JoinColumn指定一個常量,但據我所知,你不能在JoinColumn中使用公式。
所以基本上我希望能夠使用常量值作為Join的一部分進行多對多連接。 或者,如果有另一種方式來完成整個事情,我會對任何建議持開放態度。
提前致謝。
保羅
PeopleEntity.java
package com.company.system.hibernate.entities;
import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
@Entity
@Table(name = "people")
public class PeopleEntity implements Serializable {
private static final long serialVersionUID = 4550422780535557785L;
private String name;
private Set<MediaEntity> media = new HashSet<MediaEntity>(0);
private Integer id;
private String referenceType = this.getClass().getSimpleName();
@Column(name = "id", nullable = false, length = 10, precision = 0)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Basic
@Column(name = "name", nullable = false, insertable = true, updatable = true, length = 250)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable (name = "media_reference", joinColumns = {
@JoinColumn(name="reference_id", referencedColumnName="id", nullable = false, updatable = true, insertable = true),
@JoinColumn(name="reference_type", referencedColumnName="reference_type", nullable = false, updatable = true, insertable = true)
},
inverseJoinColumns = { @JoinColumn(name = "media_id", referencedColumnName = "id", nullable = false, updatable = false) })
public Set<MediaEntity> getMedia() {
return this.media;
}
public void setMedia(Set<MediaEntity> media) {
this.media = media;
}
@Basic
@Column(name = "reference_type", nullable = true, insertable = false, updatable = false)
public String getReferenceType() {
return referenceType;
}
public void setReferenceType(String referenceType) {
this.referenceType = referenceType;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof PeopleEntity)) return false;
final PeopleEntity other = (PeopleEntity) obj;
return Objects.equals(this.id, other.id) &&
Objects.equals(this.name, other.name);
}
@Override
public String toString() {
return "PeopleEntity{" +
", id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
}
MediaReferenceEntity.java
package com.company.system.hibernate.entities;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Objects;
@Entity
@Table(name = "media_reference")
public class MediaReferenceEntity implements Serializable {
private static final long serialVersionUID = 4550422780535557785L;
private Integer id;
private Integer referenceId;
private String referenceType;
private MediaEntity media;
@Id
@Column(name = "id", nullable = false, length = 10, precision = 0)
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "media_id", referencedColumnName = "id")
public MediaEntity getMedia() {
return media;
}
public void setMedia(MediaEntity media) {
this.media = media;
}
@Basic
@Column(name = "reference_id", length = 0, precision = 0)
public Integer getReferenceId() {
return referenceId;
}
public void setReferenceId(Integer referenceId) {
this.referenceId = referenceId;
}
@Basic
@Column(name = "reference_type", length = 0, precision = 0)
public String getReferenceType() {
return referenceType;
}
public void setReferenceType(String referenceType) {
this.referenceType = referenceType;
}
@Override
public String toString() {
return "MediaReferenceEntity{" +
", id='" + id + '\'' +
", referenceId='" + referenceId + '\'' +
", referenceType='" + referenceType + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MediaReferenceEntity that = (MediaReferenceEntity) o;
if (!Objects.equals(id, that.id)) return false;
if (!Objects.equals(referenceId, that.referenceId)) return false;
if (!Objects.equals(referenceType, that.referenceType)) return false;
if (!Objects.equals(media, that.media)) return false;
return true;
}
@Override
public int hashCode() {
return Objects.hash(media, referenceId, referenceType);
}
}
MediaEntity.java
package com.company.system.hibernate.entities;
import javax.persistence.*;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.Serializable;
/**
* <p>MediaEntity class.</p>
*/
@Table(name = "media")
@Entity
public class MediaEntity implements Serializable {
private static final long serialVersionUID = -1915301587741334140L;
private Integer id;
@Column(name = "id", nullable = false, length = 10, precision = 0)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
private String name;
@Column(name = "name", nullable = false, length = 100, precision = 0)
@Basic
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private byte[] file;
@Column(name = "file", length = 2147483647, precision = 0)
@Basic(fetch=FetchType.LAZY)
public byte[] getFile() {
return file;
}
@Transient
public InputStream getFileStream() {
return new ByteArrayInputStream(file);
}
public void setFile(byte[] file) {
this.file = file;
}
}
我認為如果你復制關系表不會有問題:
TABLE MEDIA (
MEDIA_ID PK
)
TABLE MEDIA_PEOPLE (
MEDIA_ID FK
PEOPLE_ID FK
)
TABLE PEOPLE (
PEOPLE_ID PK
)
TABLE MEDIA_CARS (
MEDIA_ID FK
CARS_ID FK
)
TABLE CARS (
CARS_ID PK
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.