Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在jpa单_表继承中更新父类?_Java_Jpa - Fatal编程技术网

Java 如何在jpa单_表继承中更新父类?

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

我有一个带有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 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;
    }
}