Java 如何在jpa单_表继承中更新父类?
我有一个带有ContactDTO类的JPA继承,该类由UserDTO使用单表策略扩展:Java 如何在jpa单_表继承中更新父类?,java,jpa,Java,Jpa,我有一个带有ContactDTO类的JPA继承,该类由UserDTO使用单表策略扩展: package ch.ffhs.cryptomess.server.dto; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import javax.persistence.Column; import javax.persistence.DiscriminatorColumn; import ja
package ch.ffhs.cryptomess.server.dto;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.ManyToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.persistence.Version;
import org.springframework.transaction.annotation.Transactional;
@Transactional
@Entity(name = "ch.ffhs.cryptomess.server.dto.ContactDTO")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "discriminator", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue(value = "ContactDTO")
@Table(name = "user", uniqueConstraints = @UniqueConstraint(columnNames = {
"username", "discriminator" }))
public class ContactDTO implements Serializable {
private static final long serialVersionUID = 7706720499337697645L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "user_id_seq")
@SequenceGenerator(name = "user_id_seq", allocationSize = 1, initialValue = 10)
@Column(name = "id")
protected Long id;
@Version
protected Long version;
@Column(name = "public_key", length = 255)
protected String publicKey;
@Id
@Column(length = 50, updatable = false)
protected String username;
@ManyToMany(mappedBy = "contacts", targetEntity = CommunicationDTO.class)
protected Set<CommunicationDTO> communications = new HashSet<CommunicationDTO>(
0);
@Override
public boolean equals(final Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final ContactDTO other = (ContactDTO) obj;
if (username == null) {
if (other.username != null)
return false;
} else if (!username.equals(other.username))
return false;
return true;
}
public Set<CommunicationDTO> getCommunications() {
return communications;
}
public Long getId() {
return id;
}
public String getPublicKey() {
return publicKey;
}
public String getUsername() {
return username;
}
public Long getVersion() {
return version;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((username == null) ? 0 : username.hashCode());
return result;
}
public void setCommunications(final Set<CommunicationDTO> communications) {
this.communications = communications;
}
public void setId(final Long id) {
this.id = id;
}
public void setPublicKey(final String publicKey) {
this.publicKey = publicKey;
}
public void setUsername(final String username) {
this.username = username;
}
public void setVersion(final Long version) {
this.version = version;
}
}
以及:
如果我对UserDTO实体进行合并或创建,我希望在数据库中也创建/更新ContactDTO实体。在不单独处理两个实体的情况下,有没有办法实现这一点
谢谢你的帮助 您想更新什么ContactDTO对象?您的意思是希望更新UserDTO对象的超类字段?如果JPA impl正在执行其任务,则应该是这样的:如果在UserDTO实体实例上执行合并或持久化,则没有ContactDTO,只有映射到已定义用户表中一行的UserDTO。此行应该具有UserDTO中映射的所有字段的值-java继承意味着所有字段都映射到UserDTO以及父ContactDTO定义中。如果这不是你的意思,请提供更多信息是的,我想要的是更新超类ContactDTO的字段,如果我更新UserDTO。我是JPA新手,并假设用户表中的每种类型都应该有一行特定的鉴别器。但我想我现在明白了。鉴别器仅用于继承层次结构的结尾。如果我创建一个UserDTO,则只会创建一行,如果我合并此实例的ContactDTO,则还会合并一行。谢谢你们帮助我。
package ch.ffhs.cryptomess.shared.dto;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import org.springframework.transaction.annotation.Transactional;
import ch.ffhs.cryptomess.server.dto.ContactDTO;
import com.google.gwt.view.client.ProvidesKey;
@Transactional
@Entity
@DiscriminatorValue(value = "UserDTO")
public class UserDTO extends ContactDTO implements Serializable {
private static final long serialVersionUID = -3078472527069117428L;
@Column(length = 80)
protected String password;
@Column(name = "is_account_non_expired", columnDefinition = "BIT")
protected boolean isAccountNonExpired;
@Column(name = "is_account_locked", columnDefinition = "BIT")
protected boolean isAccountLocked;
@Column(name = "is_credentials_non_expired", columnDefinition = "BIT")
protected boolean isCredentialsNonExpired;
@Column(name = "is_disabled", columnDefinition = "BIT")
protected boolean isDisabled;
/**
* The key provider that provides the unique ID of a contact.
*/
public static final ProvidesKey<UserDTO> KEY_PROVIDER = new ProvidesKey<UserDTO>() {
@Override
public Object getKey(final UserDTO item) {
return item == null ? null : item.getId();
}
};
public String getPassword() {
return password;
}
public boolean isAccountLocked() {
return isAccountLocked;
}
public boolean isAccountNonExpired() {
return isAccountNonExpired;
}
public boolean isAccountNonLocked() {
return !isAccountLocked;
}
public boolean isCredentialsNonExpired() {
return isCredentialsNonExpired;
}
public boolean isDisabled() {
return isDisabled;
}
public boolean isEnabled() {
return !isDisabled;
}
public void setAccountLocked(final boolean isAccountLocked) {
this.isAccountLocked = isAccountLocked;
}
public void setAccountNonExpired(final boolean isAccountNonExpired) {
this.isAccountNonExpired = isAccountNonExpired;
}
public void setAccountNonLocked(final boolean isAccountNonLocked) {
this.isAccountLocked = !isAccountNonLocked;
}
public void setCredentialsNonExpired(final boolean isCredentialsNonExpired) {
this.isCredentialsNonExpired = isCredentialsNonExpired;
}
public void setDisabled(final boolean isDisabled) {
this.isDisabled = isDisabled;
}
public void setEnabled(final boolean isEnabled) {
this.isDisabled = !isEnabled;
}
public void setPassword(final String password) {
this.password = password;
}
}